我有一个任意复杂的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;
}
答案 0 :(得分:1)
我只是分享了Steve Wellens的例子。我有点笨拙,但保持相同的界面,并提供灵活的工作与不断变化的DOM。
主要功能:
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)
这有点笨拙但有效: