Ответ 1
Прежде всего, это была действительно опрятная проблема. Спасибо за публикацию!
Я выполнил это с помощью закодированного оператора jQuery. Единственное, если вы запустите previous()
в верхней части ul
, вы получите body
. Я думаю, что технически это имеет смысл. Однако, если это не является желаемым поведением, см. Мое обновление ниже.
Использование: next("#ul3")
возвращает <li>5</li>
Далее:
function next(selector) {
var $element = $(selector);
return $element
.children(":eq(0)")
.add($element.next())
.add($element.parents().filter(function() {
return $(this).next().length > 0;
}).next()).first();
}
Предыдущая:
function previous(selector) {
var $element = $(selector);
return $element
.prev().find("*:last")
.add($element.parent())
.add($element.prev())
.last();
}
Обновить Если вы хотите ограничить верхнюю часть самой node предыдущей, вы можете сделать:
function previous(selector, root) {
var $element = $(selector);
return $element
.prev().find("*:last")
.add($element.parent())
.add($element.prev())
.last().not($(root).parent());
}
http://jsfiddle.net/andrewwhitaker/n89dz/
Другое обновление. Здесь для удобства используется плагин jQuery:
(function($) {
$.fn.domNext = function() {
return this
.children(":eq(0)")
.add(this.next())
.add(this.parents().filter(function() {
return $(this).next().length > 0;
}).next()).first();
};
$.fn.domPrevious = function() {
return this
.prev().find("*:last")
.add(this.parent())
.add(this.prev())
.last();
};
})(jQuery);
Расширенный пример здесь: http://jsfiddle.net/andrewwhitaker/KzyAY/