在jQuery选择器列表中查找下一个元素的最有效方法是什么?

时间:2011-04-04 23:34:20

标签: javascript jquery

我有一个任意复杂的jQuery选择器:

// a bunch of links:
var list = $('#foo').find('li.bar a, li.baz a');

我对该列表中的一个元素有句柄:

// the 11th such link:
var current = list.slice(10, 11);

list中找到之前的之后的链接的最有效方法是什么?请注意,选择器实时,并且可以在获取current之间添加或删除条目,并尝试查找下一个或上一个链接。

我能想到的最好的是list的O(n)遍历:

function adjacentInList(list, target, direction) {
  var delta = (direction === 'prev' ? -1 : 1);
  list = $(list);
  target = $(target);
  var result = null;
  list.each(function(index, element) {
    if (target[0] === element) {
      result = list.slice(index + delta, index + delta + 1);
    }
  });
  return result;
}

3 个答案:

答案 0 :(得分:1)

我只是分享了Steve Wellens的例子。我有点笨拙,但保持相同的界面,并提供灵活的工作与不断变化的DOM。

http://jsfiddle.net/sJwJL/

主要功能:

var itr = function(selector){
    var last_element = null;
    return {
        next : function(){
            var elements = $(selector);
            var last_index = 0;
            if(last_element != null){
                elements.each(function(item){
                    if(item == last_element){
                        last_index = index+1;
                        return;
                    }
                });
            }
            last_element = $(elements[last_index]);
            return last_element;
        }
    };
};

答案 1 :(得分:0)

我确定它也是O(n)的复杂性,但使用.index()语法不会更简单吗?

function next() {
   var currList = $(list.selector),
       idx = currList.index(current);
   return idx >= 0 && idx < currList.length-1 ?
       currList.slice(idx+1,idx+2) : undefined;
}

function prev() {
   var currList = $(list.selector),
       idx = currList.index(current);
   return idx > 0 ? 
       currList.slice(idx - 1, idx) : undefined;
}

有关完整示例,请参阅http://jsfiddle.net/yAFr5/12/

答案 2 :(得分:-1)

这有点笨拙但有效:

http://jsfiddle.net/zHDws/