这是我的版本。它是页面上所有jQuery插件类型答案中
表现最佳的一个。它是唯一一个可以处理空的jQuery对象
$()
而不出错的插件。和Jamie Wong的答案一样,它也是唯一一个可以处理单个jQuery对象而不出错的插件。
我创建了
一个jsfiddle展示所有版本的输出。您可以点击预设按钮轻松查看不同的测试用例,或者输入自己的选择器并单击“查找”以查看结果。
jQuery.fn.reverse = function() {
return Array.prototype.reverse.call(this);
};
jQuery.fn.commonAncestor = function() {
var i, l, current,
compare = this.eq(0).parents().reverse(),
pos = compare.length - 1;
for (i = 1, l = this.length; i < l && pos > 0; i += 1) {
current = this.eq(i).parents().reverse();
pos = Math.min(pos, current.length - 1);
while (compare[pos] !== current[pos]) {
pos -= 1;
}
}
return compare.eq(pos);
};
在一个元素是另一个元素的祖先的情况下,到目前为止给出的所有答案都返回祖先元素的父元素。上面的链接都包含了我的函数的一个版本,如果例如页面上有一个div,
$('body, div').commonAncestor()
将返回
body
而不是
html
。
注意:此函数假定jQuery集合中的所有项都在当前文档中。要将来自两个不同文档的元素放入同一个jQuery对象中需要特殊而奇怪的努力--在这种情况下,我的函数将失败(页面上的所有其他函数也将失败)。可以通过从更改for条件
pos > 0
为
pos >= 0
开始进行纠正,使while循环处理-1的情况,并可能将
return compare.eq(pos)
更改为
return $(compare[pos])
(因为eq()函数使用负索引从末尾向后索引而不是返回空)。