如何在不按 DOM 顺序排序的情况下将 jquery 选择添加到一起



我有一个jQuery元素,我想搜索所有下一个兄弟姐妹寻找可能的匹配,如果失败,则搜索所有以前的。

我本来以为我可以做这样的事情:

myDiv.nextAll("li").add(myDiv.prevAll("li")).each(function()
{
     if (match) { return this; }
}

但是,这不起作用。当我调用jquery Add时,它似乎按照它们在DOM中出现的顺序对集合进行排序,这意味着我总是回到第一个匹配的元素。我想不出一个简单的方法来解决这个问题,有什么想法吗?

您是正确的,大多数 jQuery 操作将 DOM 元素按 DOM 排序顺序排列。 这就是jQuery的工作方式,它这样做是因为它通常非常有用和重要。

但是,在您的情况下,我认为这意味着您必须进行两次单独的搜索,以便以正确的顺序搜索内容。 如果第一次搜索找不到结果,则执行第二次搜索:

function fn() {
    if (match) {return this;}
}
var results = myDiv.nextAll("li").each(fn);
if (!results.length) {
    results = myDiv.prevAll("li").each(fn);
}

我能想到的唯一其他解决方案是使用未排序的元素创建自己的jQuery对象。 您需要对 jQuery DOM 元素数组进行手动操作,而不是使用像 .add() 这样自动排序的内置方法。 在这种特殊情况下,这不会比我们上面拥有的代码少,也不会是解决问题的更有效的方法,因为即使您不需要prevAll()集,您也会获得所有 DOM 元素。

根据您的评论,如果您希望 prevAll() 项按 DOM 顺序排序,则必须执行以下操作:

function fn() {
    if (match) {return this;}
}
var results = myDiv.nextAll("li").each(fn);
if (!results.length) {
    results = $().add(myDiv.prevAll("li")).each(fn);
}

额外的.add()将导致 jQuery 将.prevAll()结果按 DOM 顺序排序。

相关内容

最新更新