4

querySelectorに渡すのに適したCSSセレクターとして、要素への相対参照を格納するアプリケーションを作成しています。「base」要素への相対参照を保存する場合は、同じ要素を返すセレクターが必要です。

レベル1セレクターAPIで定義されているquerySelectorメソッドのIDセレクターは、次の条件を満たすものですか?Element

var identitySelector = "<this is the selector I want to know>"

for (int i = 0; i < document.all.length; i++) {
    var elem = document.all[i];
    if (elem !== elem.querySelector(identitySelector)) {
        throw identitySelector + " is not the identity selector";
    }
}

アップデート:

このセレクターは使用できないため、querySelectorの呼び出しを、セレクターが疑似クラスと等しい場合にコンテキスト要素を返す関数でラップします:root

var identitySelector = ":root"

var querySelectorProxy = function(elem, selector) {
    return selector === ':root' ? elem: elem.querySelector(identitySelector);
}

for (int i = 0; i < document.all.length; i++) {
    var elem = document.all[i];
    if (elem !== querySelectorProxy(elem, selector)) {
        throw identitySelector + " is not the identity selector";
    }
}
4

1 に答える 1

3

ありません。


John Resigは、彼のブログトピック「querySelectorAllについての考え」でディスカッションへのリンクを提供しました。

彼の強みは、どの要素ノードからでも検索できますが、渡すセレクターはドキュメント全体を考慮に入れるということです。(個人的には、これが正しいアプローチだと思います。)このため、彼はあなたが説明しているようなIDセレクターがあることを望んでいました。

jQuery(Sizzle)は、要素のIDを使用して(または使用できない場合は一時的なIDを割り当てて)、セレクターを再構築してそのIDセレクターを付加することにより、少しハックを使用します。

このようなもの:

var identitySelector = "<this is the selector I want to know>"

for (int i = 0; i < document.all.length; i++) {
    var elem = document.all[i],
        needs_id = false;
    if( !elem.id ) {
        needs_id = true;
        elem.id = '___some___obscure___value___';
    }
    if (elem !== elem.querySelector( '#' + elem.id )) {
        throw identitySelector + " is not the identity selector";
    }
    if( needs_id ) {
        elem.id = null;
    }
}

...これがここで何を達成するかはわかりませんが。

于 2011-09-16T20:45:54.267 に答える