我使用 JQuery 选择页上的某些元素,然后移动它们的数组。我遇到的问题是我需要 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 等。这是否可能?

2009-09-08 13:24:37
问题评论:

回答:

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

这并不工作,在我结束时,可能因为反转功能未定义。

由于 JavaScript 1.1,Array.reverse 已经推出。您正在使用哪种浏览器?

再次用一看。工作正常。

应注意,索引不可逆,因此,如果您只想要做最后一个三,例如,不能指望<li>Item 5</li>具有索引为 0。

对 David Andres︰ 可能是您忘了添加额外的 $ () 之前 li。我做了这个错误,接收到"未定义函数求"。

我向您提供全新方式曾有过世界上最小的 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

好吧,我同意这很酷,但它为什么工作?要复制 (松说话) Array.prototype.reverse 到 jQuery.prototype.reverse,并调用this对象具有数值属性和 length 属性,因此 javascript 可以对其进行索引,并可以将数组函数应用于一个 jQuery 实例时?

应注意,索引不可逆,因此,如果您只想要做最后一个三,例如,不能指望<li>Item 5</li>具有索引为 0。

@Matthew-是的您了解其右。该代码实际上复制对Array.prototype.reverse引用转移到jQuery.prototype.reverse很多的 JavaScript 数组方法适合对任何看起来足够的类似数组的对象是否有.length和数字索引属性的对象。reverse不取决于一些内部数组表示形式;访问数组使用普通.length[0][1]就像您要编写自己的阵列代码等。

不是一种浪费来实例化一个新数组,仅仅为了获得其reverse方法?岂不是更快只复制到参考函数Array.prototype.reverse,通过例如jQuery.fn.reverse = Array.prototype.reverse;不短,"聪明",但效率更高吗?不可否认这将可能在今天的闪电般快速的浏览器,不会被察觉,但仍是...

@zachelrath 是,不能出现任何一种分离的结果,不再。它看起来像 20%是刚刚 fluke。请记住,您一次只能设置该函数,以便实例化只发生一次,从那里函数设置了。

您可以执行

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

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

这种方法是最初提议由 John Resig (jQuery 开发人员) 在jQuery 邮寄列表.

我更喜欢创建反向如插件

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

我喜欢这主意/代码,但它不会返回可链接对象 (相反) 高投票回答像:)仍然,肯定它的安装程序的方式很好的方法

你是对的。没有可因此不是有效的插件。稍有改进的代码 decrementer,转入条件。

以下是对此有不同的选项︰

第一︰ 没有 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);
});

演示此处

内容来源于Stack Overflow JQuery .each() backwards
请输入您的翻译

JQuery .each() backwards

确认取消