排序DOM元素在IE 8中不起作用

时间:2013-06-20 10:50:03

标签: javascript internet-explorer-8

我正在尝试按照以下方式对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。

P.S。 jQuery版本是1.7.2

2 个答案:

答案 0 :(得分:1)

为什么要排序?

var items = $("ul li")
items = [].concat(items.filter(".selected").toArray()
                  ,items.filter(":not(.selected)").toArray())

答案 1 :(得分: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());
    }
}

出于某种原因,上述工作原理,但我在参数中重新分配不同值的初始版本没有。