JQuery .each()向后

Jac*_*lls 432 javascript arrays jquery 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>
Run Code Online (Sandbox Code Playgroud)

我想选择所有的li项目并对它们使用.each()命令,但我想从第5项开始,然后是项目4等.这可能吗?

Joe*_*ung 667

$($("li").get().reverse()).each(function() { /* ... */ });
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意索引没有反转,所以如果你只想做最后三个,你不能指望`<li> Item 5 </ li>`的索引为0. (10认同)
  • 大卫安德烈斯:可能你忘记在李之前添加额外的$().我犯了这个错误并收到了"undefined func". (8认同)
  • @DavidAndres:您错过了`.get()`,它将jQuery包装的数组转换为普通的JS数组.JS数组有`.reverse()`. (2认同)
  • 注意:`Array.reverse()` 既修改数组 ** 就地** 又返回反向数组。所以这个解决方案实际上依赖于 $().get() 返回一个新数组,_not_ 对一些内部 jQuery 或 DOM 数组的引用。在这个例子的范围内可能是一个安全的赌注。警告编码器。 (2认同)

Wal*_*ton 400

我用最干净的方式呈现给你,以世界上最小的jquery插件的形式:

jQuery.fn.reverse = [].reverse;
Run Code Online (Sandbox Code Playgroud)

用法:

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

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

  • 实现一个新的数组只是为了得到它的"反向"方法不浪费吗?复制对函数`Array.prototype.reverse`的引用不会更快,例如`jQuery.fn.reverse = Array.prototype.reverse;`?不是短而"聪明",而是更有效率?不可否认,这在今天的闪电般快速的浏览器中可能不会引起注意,但仍然...... (8认同)
  • 重要的是要注意索引没有反转,所以如果你只想做最后三个,你不能指望`<li> Item 5 </ li>`的索引为0. (5认同)
  • @zachelrath是的,我不能在结果之间得到任何分离.看起来20%只是侥幸.请记住,您只需设置一次该函数,因此实例化只发生一次,从那里设置了函数. (3认同)

Vin*_*jip 63

你可以做

jQuery.fn.reverse = function() {
    return this.pushStack(this.get().reverse(), arguments);
}; 
Run Code Online (Sandbox Code Playgroud)

其次是

$(selector).reverse().each(...) 
Run Code Online (Sandbox Code Playgroud)

  • 这种方法最初由John Resig(jQuery开发人员)在[jQuery邮件列表](http://www.mail-archive.com/discuss@jquery.com/msg04272.html)上提出. (13认同)

Ser*_*gio 20

以下是不同的选项:

第一:没有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;
});
Run Code Online (Sandbox Code Playgroud)

在这里演示

...和jQuery:

你可以用这个:

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

在这里演示

另一种方式,使用反向 jQuery 是:

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

这个演示在这里.

一种选择是使用length(匹配该选择器的元素的数量)并使用index每次迭代从那里向下移动.然后你可以使用这个:

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

这个演示在这里

还有一种,与上述有关:

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

在这里演示


Jam*_*ate 14

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

jQuery.fn.reverse = function(fn) {       
   var i = this.length;

   while(i--) {
       fn.call(this[i], i, this[i])
   }
};
Run Code Online (Sandbox Code Playgroud)

用法例如:

$('#product-panel > div').reverse(function(i, e) {
    alert(i);
    alert(e);
});
Run Code Online (Sandbox Code Playgroud)


小智 8

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

[].reverse.call($('li'));
Run Code Online (Sandbox Code Playgroud)


小智 5

需要对$ .each进行反向操作,因此我使用了Vinay的想法:

//jQuery.each(collection, callback) =>
$.each($(collection).get().reverse(), callback func() {});
Run Code Online (Sandbox Code Playgroud)

工作很好,谢谢