JQuery .each()向后

时间:2009-09-08 13:24:37

标签: javascript jquery arrays reverse

我正在使用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等。这可能吗?

12 个答案:

答案 0 :(得分:645)

$($("li").get().reverse()).each(function() { /* ... */ });

答案 1 :(得分:395)

我以世界上最小的jquery插件的形式向你展示最干净的方式:

jQuery.fn.reverse = [].reverse;

用法:

$('jquery-selectors-go-here').reverse().each(function () {
    //business as usual goes here
});

- Michael Geary在帖子中的所有功劳:http://www.mail-archive.com/discuss@jquery.com/msg04261.html

答案 2 :(得分:61)

你可以做到

jQuery.fn.reverse = function() {
    return this.pushStack(this.get().reverse(), arguments);
}; 

接着是

$(selector).reverse().each(...) 

答案 3 :(得分:17)

以下是不同的选项:

首先:没有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;
});

演示here

...和jQuery:

您可以使用:

$($("ul > li").get().reverse()).each(function (i) {
    $(this).text( 'Item ' + (++i));
});

演示here

另一种方式,使用jQuery和reverse

$.fn.reverse = [].reverse;
$("ul > li").reverse().each(function (i) {
    $(this).text( 'Item ' + (++i));
});

此演示here

另一个替代方法是使用length(与该选择器匹配的元素数)并使用每次迭代的index从那里开始。然后你可以使用它:

var $li = $("ul > li");
$li.each(function (i) {
    $(this).text( 'Item ' + ($li.length - i));
});

此演示here

还有一个,与上面的相关:

var $li = $("ul > li");
$li.text(function (i) {
    return 'Item ' + ($li.length - i);
});

演示 here

答案 4 :(得分:13)

我更喜欢创建反向插件,例如

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

答案 5 :(得分:7)

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

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

答案 6 :(得分:4)

需要对$ .each进行反转,所以我使用了Vinay的想法:

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

很好地工作,谢谢

答案 7 :(得分:2)

你不能使用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
}

答案 8 :(得分:1)

我发现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);
}

答案 9 :(得分:0)

我认识到jQuery支持并鼓励插件。也就是说,您可能会发现这篇文章相关:Don’t modify objects you don’t own。至少在这种情况下,我选择不扩展jQuery,以防止另一个插件以不同的方式定义反向。

这是一个不扩展jQuery对象的简单解决方案。

function jqueryReverse( set ) {

    return [].reverse.call( set );
}

console.log( jqueryReverse( $( 'li' ) ) );

答案 10 :(得分:-2)

我想你需要

.parentsUntill()

答案 11 :(得分:-2)

您也可以尝试

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