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

时间:2012-04-18 17:07:54

标签: javascript jquery

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

我原本以为我可以这样做:

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

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

1 个答案:

答案 0 :(得分:3)

大多数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())。在这种特殊情况下,代码不会比我们上面的代码少,也不会是解决问题的更有效方法,因为即使你不需要{{1}也可以获得所有DOM元素} set。

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

prevAll()

额外function fn() { if (match) {return this;} } var results = myDiv.nextAll("li").each(fn); if (!results.length) { results = $().add(myDiv.prevAll("li")).each(fn); } 将导致jQuery将.add()结果排序为DOM顺序。