6

dojo.connect() を使用して「onclick」イベントをこのボタンに接続する際に問題が発生しています。

<button dojoType="dijit.form.Button" widgetId="inbox_button" id="inbox_button">Inbox</button>

接続を行うコードは次のとおりです。

var inbox_button=dojo.byId("inbox_button");
dojo.connect(inbox_button,'onclick',function(){
    var container=dijit.byId("center");
    container.addChild(new dijit.layout.ContentPane({region: "left", content: "...", style: "width: 100px;"}))
});

ただし、ボタンがクリックされたときに関数を実行する代わりに、任意の onclick イベントが関数をトリガーし、多くの子コンテナーが作成されます。

私は .connect() 関数が Dojo の基本機能の一部として利用可能であるべきだと確信していますが、私はそれを明示的に「要求」しました:

dojo.require("dojo._base.connect");

なぜこれが起こっているのかについてのアイデアはありますか?

4

2 に答える 2

12

As you say, if you run that code before the DOM is ready, dojo.byId("inbox_button") will return null. So your connect is actually doing:

dojo.connect(null, "onclick", function() { ... })

.. if the 1st arg to dojo.connect is null, the global or 'window' object will be used.

But, that's just one error here. Your button element is getting widget-ized, and turned into a dijit.form.Button. So you should be connecting to the widget's onClick method here, not the node's onclick:

dojo.connect(dijit.byId("inbox_button"), "onClick", function() { ... });

Also, to be clear, you should never have to dojo.require anything in dojo._base, that's the promise that dojo.js makes to you - its all bundled in.

于 2010-06-15T13:06:43.223 に答える
2

私自身の質問に答えるには:dojo.addOnLoadの値を過小評価しないでください!

ボタンはウィジェットとして使用されていたため、Dojoの読み込みが完了するまでIDが登録されておらず、接続コードがaddOnLoadブロック内になかったため、(まだ読み込まれていない)ボタンが見つかりませんでした。 。したがって、メソッドがすべてのクリックイベントで起動した理由は、Dojoがconnect()関数でnullオブジェクトを処理する方法が原因でした。オブジェクトを無視し、代わりにdojo.global(Dojoのバージョンのdocument.window)を使用します。物体。

これが同様の問題に遭遇した可能性のある他の人に役立つことを願っています!

于 2010-06-09T20:40:18.310 に答える