Ответ 1
$($("li").get().reverse()).each(function() { /* ... */ });
Я использую JQuery для выбора некоторых элементов на странице, а затем перемещаю их в DOM. Проблема, с которой я сталкиваюсь, - это выбрать все элементы в обратном порядке, которые JQuery естественно захочет выбрать. Например:
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ul>
Я хочу выбрать все элементы li и использовать для них команду .each(), но я хочу начать с пункта 5, затем пункта 4 и т.д. Возможно ли это?
$($("li").get().reverse()).each(function() { /* ... */ });
Я представляю вам самый чистый способ когда-либо, в виде самого маленького плагина jquery:
jQuery.fn.reverse = [].reverse;
Использование:
$('jquery-selectors-go-here').reverse().each(function () {
//business as usual goes here
});
-Все кредит Майкла Гири в его сообщении здесь: http://www.mail-archive.com/[email protected]/msg04261.html
Вы можете сделать
jQuery.fn.reverse = function() {
return this.pushStack(this.get().reverse(), arguments);
};
за которым следует
$(selector).reverse().each(...)
Вот несколько вариантов для этого:
Первый: без jQuery:
var lis = document.querySelectorAll('ul > li');
var contents = [].map.call(lis, function (li) {
return li.innerHTML;
}).reverse().forEach(function (content, i) {
lis[i].innerHTML = content;
});
... и с jQuery:
Вы можете использовать это:
$($("ul > li").get().reverse()).each(function (i) {
$(this).text( 'Item ' + (++i));
});
Демо здесь
Другой способ, используя также jQuery с reverse:
$.fn.reverse = [].reverse;
$("ul > li").reverse().each(function (i) {
$(this).text( 'Item ' + (++i));
});
Эта демонстрация здесь.
Еще одна альтернатива - использовать length
(количество элементов, соответствующих этому селектору), и спуститься туда, используя index
каждой итерации. Затем вы можете использовать это:
var $li = $("ul > li");
$li.each(function (i) {
$(this).text( 'Item ' + ($li.length - i));
});
Эта демонстрация здесь
Еще один, относящийся к приведенному выше:
var $li = $("ul > li");
$li.text(function (i) {
return 'Item ' + ($li.length - i);
});
Демо здесь
Я предпочитаю создание обратного подключаемого модуля, например
jQuery.fn.reverse = function(fn) {
var i = this.length;
while(i--) {
fn.call(this[i], i, this[i])
}
};
Использование, например:
$('#product-panel > div').reverse(function(i, e) {
alert(i);
alert(e);
});
Если вы не хотите сохранять метод в jQuery.fn, вы можете использовать
[].reverse.call($('li'));
Нужно сделать обратное на $.each, поэтому я использовал идею Vinay:
//jQuery.each(collection, callback) =>
$.each($(collection).get().reverse(), callback func() {});
работал красиво, спасибо
Вы не можете повторять итерацию с помощью каждой функции jQuery, но вы все равно можете использовать синтаксис jQuery.
Попробуйте следующее:
//get an array of the matching DOM elements
var liItems = $("ul#myUL li").get();
//iterate through this array in reverse order
for(var i = liItems.length - 1; i >= 0; --i)
{
//do Something
}
Я нашел Array.prototype.reverse
неудачным с объектами, поэтому я использовал новую функцию jQuery для использования в качестве альтернативы: jQuery.eachBack()
. Он выполняет итерацию, поскольку обычный jQuery.each()
будет и сохраняет каждый ключ в массив. Затем он меняет этот массив и выполняет обратный вызов исходного массива/объекта в порядке обратных ключей.
jQuery.eachBack=function (obj, callback) {
var revKeys=[]; $.each(obj,function(rind,rval){revKeys.push(rind);});
revKeys.reverse();
$.each(revKeys,function (kind,i){
if(callback.call(obj[i], i, obj[i]) === false) { return false;}
});
return obj;
}
jQuery.fn.eachBack=function (callback,args) {
return jQuery.eachBack(this, callback, args);
}
Я понимаю, что jQuery поддерживает и поощряет плагины. Тем не менее, вы можете найти эту статью релевантной: Не изменяйте объекты, которые у вас нет. В этом случае, по крайней мере, я решил не распространять jQuery на случай, когда другой плагин определяет обратное по-разному.
Здесь простое решение, которое не расширяет объект jQuery.
function jqueryReverse( set ) {
return [].reverse.call( set );
}
console.log( jqueryReverse( $( 'li' ) ) );
Я думаю, вам нужно
.parentsUntill()
Вы также можете попробовать
var arr = [].reverse.call($('li'))
arr.each(function(){ ... })