document.getElementById
dojo/query 用の Dojo のライブラリーのコードを見ると、渡されたセレクターが ID セレクターである場合、 デフォルトで使用されるように見えます。
たとえば、次のようにします。
query("#myId")
これは舞台裏で実行されます:
document.getElementById("myId")
これは、ウィンドウ ドキュメント内のノードをクエリする場合には問題ありませんが、ドキュメントにまだ配置されていないノードを構築する場合はどうなるでしょうか? 後で DOM に配置するためにメモリ内にノードを構築していて、そのノードを ID でクエリする必要がある場合、それはできません。このノードはまだドキュメントにないためです。
これがjQueryのやり方であることは理解していますが、IDまたは別のセレクター(クラス、属性など)によるクエリのアプローチは関係なく同じであるため、jQueryは異なります。例えば:
$("#myId")
$(".myClass")
$("div[align=center]")
アプローチは同じです。したがって、この場合のデフォルトdocument.getElementById
は私にとっては問題ありません。
Dojo では、Dojo が のエイリアスとして機能する別の関数を提供しているという事実に照らして、かなり誤解を招きますgetElementById (dom.byId)
。実際のドキュメントに対する ID クエリが必要な場合は、それを使用します。セレクターで dojo/query を使用している場合は、ドキュメントまたはコンテキスト ノードをクエリできるようにしたいと考えています。
Dojo は、実行可能なネイティブ セレクター エンジンが使用可能な状況で、lite.jsセレクター エンジンを使用します。ファイルの先頭には、実際にこのデフォルトを実行する「高速パス」ブロックがありますdom.byId
。このブロックをコメントアウトすると、エンジンは を使用するように戻り、querySelectorAll
この問題が修正されます。
Dojo がこれを行う理由を説明できる人はいますか? または、Dojo のコードをコメントアウトする必要のない実行可能な回避策がある場合は? ID の代わりに data-attributes を使用する方法が有効であると私が見たことがあります。
編集:
注: 照会時にコンテキスト・ノードを dojo/query に渡すことができますが、Dojo では、dom-construct を使用して DOM の外側にノードを作成しても、そのノードの ownerDocument は依然として window.document です。言い換えると:
var node = domConstruct.toDom('<div><p><span id="myId">Content</span></p></div>');
var doc = node.ownerDocument;
'doc' が window.document になります。したがって、次のようなことを行います。
doc.getElementById("myId")
失敗します。これと同様に:
var results = query("#myId", node);
Dojo のコードは、やはり window.document である「ノード」の ownerDocument を探すためです。