JQuery .each() 向后

IT技术 javascript jquery arrays reverse
2021-01-23 15:25:09

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

6个回答
$($("li").get().reverse()).each(function() { /* ... */ });
注意: Array.reverse()两者都在原地修改数组并返回反向数组。所以这个解决方案实际上依赖于 $().get() 返回一个新数组,而不是对某些内部 jQuery 或 DOM 数组的引用。在这个例子的范围内可能是一个安全的赌注。警告编码器。
2021-03-18 15:25:10
应该重要的是要注意索引不是反向的,所以如果你只想做最后三个,例如,你不能期望<li>Item 5</li>索引为 0。
2021-04-02 15:25:10
对大卫安德烈斯:可能是你忘了在 li 之前添加额外的 $() 。我犯了这个错误并收到了“未定义的函数”。
2021-04-02 15:25:10
@DavidAndres:您错过了.get()将 jQuery 包装的数组转换为普通 JS 数组的方法。JS 数组有.reverse().
2021-04-06 15:25:10

我以世界上最小的 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

你可以做

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

其次是

$(selector).reverse().each(...) 
这种方法最初是由 John Resig(jQuery 开发人员)在jQuery 邮件列表上提出的
2021-03-17 15:25:10

这里有不同的选项:

第一:没有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);
});
我也喜欢这个想法/代码,但它不会像高票答案一样返回一个可链接的对象(相反):) 尽管如此,对于它的设置方式来说绝对是一个好方法
2021-03-17 15:25:10
你说的对。不可链接,因此不是有效的插件。不过稍微改进了代码,将递减器移到条件中。
2021-04-01 15:25:10