0

我正在尝试对 IE8 中的列表元素数组进行排序,如下所示:

function comparator(params) {
    var keepSelectedOnTop = params.keepSelectedOnTop;

    return function (a, b) {    // a, b are DOM objects
        a = $(a);  // wrap with jQuery
        b = $(b);

        if (keepSelectedOnTop) {
            if (a.is(".selected") && !b.is(".selected")) {
                return -1;
            } else if (!a.is(".selected") && b.is(".selected")) {
                return 1;
            }
        }

        return a.text().localeCompare(b.text());
    }
}

// ...

var items = $("ul li").detach().toArray();

items.sort(comparator(params));

这适用于小列表,但是当我有很多元素时会undefined is null or not an object出错。当我用调试器打破异常bundefined在分配之后。

有没有人遇到过这个?它在其他浏览器中运行良好,而且似乎是完全有效的 JS。

PS jQuery 版本是 1.7.2

4

2 回答 2

1

为什么要排序?

var items = $("ul li")
items = [].concat(items.filter(".selected").toArray()
                  ,items.filter(":not(.selected)").toArray())
于 2013-06-24T14:44:01.497 回答
0

经过几次试错尝试后,似乎更改比较器中的分配可以解决问题,但这没有任何意义:

function comparator(params) {
    var keepSelectedOnTop = params.keepSelectedOnTop;

    return function (aDom, bDom) {
        var a = $(aDom), b = $(bDom);  // Use different vars for the wrappers

        if (keepSelectedOnTop) {
            if (a.is(".selected") && !b.is(".selected")) {
                return -1;
            } else if (!a.is(".selected") && b.is(".selected")) {
                return 1;
            }
        }

        return a.text().localeCompare(b.text());
    }
}

出于某种原因,上述方法有效,但我为参数重新分配不同值的初始版本无效。

于 2013-06-24T15:47:21.037 回答