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 に答える