Попробуйте это. Он будет отмечать ваш элемент, создать набор элементов, соответствующих вашему селектору, и собрать все элементы из набора, следующего за вашим элементом.
$.fn.findNext = function (selector) {
var set = $([]), found = false;
$(this).attr("findNext" , "true");
$(selector).each(function(i , element) {
element = $(element);
if (found == true) set = set.add(element)
if (element.attr("findNext") == "true") found = true;
})
$(this).removeAttr("findNext")
return set
}
EDIT
гораздо более простое решение с использованием jquerys индексного метода. элемент вызова метода из потребности быть выбираются тем же селектор, хотя
$.fn.findNext = function(selector){
var set = $(selector);
return set.eq(set.index(this,) + 1)
}
освободить функцию от этого гандикапа, мы могли бы Youse браузеров собственных compareDocumentposition
$.fn.findNext = function (selector) {
// if the stack is empty, return the first found element
if (this.length < 1) return $(s).first();
var found,
that = this.get(0);
$(selector)
.each(function() {
var pos = that.compareDocumentPosition(this);
if (pos === 4 || pos === 12 || pos === 20){
// pos === 2 || 10 || 18 for previous elements
found = element;
return false;
}
})
// using pushStack, one can now go back to the previous elements like this
// $("#someid").findNext("div").remove().end().attr("id")
// will now return "someid"
return this.pushStack([ found ]);
},
EDIT 2 это намного проще с использованием $ .grep jQuery. вот новый код
$.fn.findNextAll = function(selector){
var that = this[ 0 ],
selection = $(selector).get();
return this.pushStack(
// if there are no elements in the original selection return everything
!that && selection ||
$.grep(selection, function(n){
return [4,12,20].indexOf(that.compareDocumentPosition(n)) > -1
// if you are looking for previous elements it should be [2,10,18]
})
);
}
$.fn.findNext = function(selector){
return this.pushStack(this.findNextAll(selector).first());
}
При сжатии имен переменных это становится всего лишь двумя слоями.
Редактировать 3 используя побитовые операции, эта функция может быть еще быстрее?
$.fn.findNextAll = function(selector){
var that = this[ 0 ],
selection = $(selector).get();
return this.pushStack(
!that && selection || $.grep(selection, function(n){
return that.compareDocumentPosition(n) & (1<<2);
// if you are looking for previous elements it should be & (1<<1);
})
);
}
$.fn.findNext = function(selector){
return this.pushStack(this.findNextAll(selector).first());
}
возможно дубликат [JQuery найти все предыдущие элементы, которые соответствуют выражение] (http://stackoverflow.com/questions/322912/jquery-to-find-all-previous-elements-that-match- an-expression) – sachleen