2

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

我原以为我可以做类似的事情:

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

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

4

1 回答 1

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()自动排序这样的内置方法。在这种特殊情况下,这不会比我们上面的代码少,也不会是解决问题的更有效方法,因为即使您不需要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 顺序。

于 2012-04-18T17:12:37.743 回答