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

正如您所说,如果您在 DOM 准备好之前运行该代码, dojo.byId("inbox_button") 将返回 null。所以你的连接实际上是在做:

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

.. 如果 dojo.connect 的第一个参数为空,则将使用全局或“窗口”对象。

但是,这只是一个错误。您的按钮元素正在小部件化,并变成 dijit.form.Button。所以你应该在这里连接到小部件的 onClick 方法,而不是节点的 onclick:

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

另外,需要明确的是,您永远不必在 dojo._base 中使用 dojo.require 任何东西,这是 dojo.js 对您做出的承诺 - 它全部捆绑在其中。

于 2010-06-15T13:06:43.223 回答
2

回答我自己的问题:永远不要低估 dojo.addOnLoad 的价值!

我觉得由于该按钮被用作小部件,因此直到 Dojo 完成加载后才注册它的 ID,并且由于连接代码不在 addOnLoad 块中,因此找不到(尚未加载)按钮. 那么,该方法在每个单击事件上触发的原因是 Dojo 在 connect() 函数中处理空对象的方式:它忽略它们,而是使用 dojo.global(Dojo 的 document.window 版本)作为目的。

我希望这对可能遇到类似问题的其他人有所帮助!

于 2010-06-09T20:40:18.310 回答