4

document.getElementByIddojo/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' が wi​​ndow.document になります。したがって、次のようなことを行います。

doc.getElementById("myId")失敗します。これと同様に:

var results = query("#myId", node);

Dojo のコードは、やはり window.document である「ノード」の ownerDocument を探すためです。

4

4 に答える 4

3
 var hellopuppy = dojo.query("[id='myId']",node);
于 2013-09-12T20:47:25.223 に答える
0

ノードがまだ DOM にない場合、Dojo のqueryセレクターを使用してアクセスすることはできません。ただし、ノードが dijit レジストリにある場合は、 でアクセスできますdijit.registry.byId(<id>)

于 2013-09-12T14:17:03.127 に答える
0

これはハックかもしれませんが、役立つかもしれません。

function foo(){
    this.bar = bar();
    bar.[access the properties of the div here]
}

function bar(){
   this.somenode = document.createElement("div");
   return this.somenode;
}

ページに追加せずに div (この場合はバー) のプロパティにアクセスできます。bar() の「somenode」は、有効な html 要素であれば何でもかまいません。

于 2013-09-12T14:53:10.250 に答える
0

はい、コンテキストを指定する場合query('#myid', nodeInMemory)は使用しないようですdocument.etElementById()

回避策は使用することです

dojo.query("[id='myid']", nodeInMemory);
于 2013-09-12T20:51:58.700 に答える