使用find()方法反转JQuery的each()方法

8

我知道这种问题以前已经被问过了,但是通常的解决方案是

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

对我来说不起作用。我有一个包含音乐会列表的XML文档,我想在网页上显示它们。所以,在JQuery中:

$.ajax({
    type: "GET",
    url: "concerts.xml",
    dataType: "xml",
    cache: false,
    success: function(xml) {
        $(xml).find('concert').each(function() {
            /*do stuff*/
        });
    }
});

然而,我希望以相反的顺序显示音乐会。于是,我尝试了下面的方法,但没有成功:

$.ajax({
    type: "GET",
    url: "concerts.xml",
    dataType: "xml",
    cache: false,
    success: function(xml) {
        $($(xml).find('concert').reverse()).each(function() {
            /*do stuff*/
        });
    }
});

任何帮助将不胜感激。谢谢。

1
尝试将你所做的事情反过来做。例如,不要使用 appendChild,而是使用 insertBefore(0, item) - Ry-
为了澄清上述内容,调用应该是:$($(xml).find('concert').get().reverse()).each(function() { /* ... */ }); - rossipedia
2个回答

21

你忽略了调用get()[文档]方法。

   // --------------------v
$($(xml).find('concert').get().reverse()).each(function() {

需要这样做才能从jQuery对象中获取元素的数组。这是允许您调用 .reverse() 的原因,该方法在 Array.prototype 上。


谢谢,现在一切都好了。我以为 .find('concert') 给了我所需的数组;我不知道需要使用 get() - ethan.roday

3
要以相反的顺序遍历项目,为什么不使用以下代码呢:

var data = $("input");
for (var i = data.length - 1; i >= 0; i--) {
    var item = data[i];
    // do whatever you want to do with item here
}

或者,如果你希望将其制作成一个以 jQuery 对象和你的函数为参数的函数:

function reverseEach(jQueryObj, fn) {
    for (var i = jQueryObj.length - 1; i >= 0; i--) {
        if (fn.call(jQueryObj[i], i, jQueryObj[i]) === false) {
            break;
        }
    }
}

因此,您可以调用:

reverseEach($(xml).find('concert'), function() {
    // do stuff here
});

或者:

reverseEach($("input"), function() {
    // do stuff here
});

或者,你甚至可以将reverseEach制作成一个jQuery插件。


太好了,这是一个非jQuery的答案(for (var i = data.length - 1; i >= 0; i--) {})。 - doubleJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接