jQuery .each()向后

我使用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> 

我想选择所有的李项目和使用.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 }); 

– 所有信贷迈克尔Geary在他的职位在这里: http : //www.mail-archive.com/discuss@jquery.com/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的是:

 $.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); }); 

需要对$ .each做一个反转,所以我用Vinay的想法:

 //jQuery.each(collection, callback) => $.each($(collection).get().reverse(), callback func() {}); 

很好地工作,谢谢

如果你不想保存方法到jQuery.fn你可以使用

 [].reverse.call($('li')); 

你不能用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' ) ) ); 

你也可以试试

 var arr = [].reverse.call($('li')) arr.each(function(){ ... }) 

我想你需要

 .parentsUntill()