dojo.connect不会将'onclick'与按钮连接起来

Dan*_*iel 6 dojo onclick button connect

我正在使用dojo.connect()来解决问题,使用此按钮连接'onclick'事件:

<button dojoType="dijit.form.Button" widgetId="inbox_button" id="inbox_button">Inbox</button>
Run Code Online (Sandbox Code Playgroud)

和连接的代码是:

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;"}))
});
Run Code Online (Sandbox Code Playgroud)

但是,单击按钮时不是执行该功能,任何onclick事件都会触发该功能,最终我会收到很多子容器.

尽管我很确定.connect()函数应该作为dojo基本功能的一部分提供,但我已经明确地要求它:

dojo.require("dojo._base.connect");
Run Code Online (Sandbox Code Playgroud)

关于为什么会发生这种情况的任何想法?

小智 12

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

dojo.connect(null, "onclick", function() { ... })
Run Code Online (Sandbox Code Playgroud)

..如果dojo.connect的第一个arg为null,则将使用全局或"窗口"对象.

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

dojo.connect(dijit.byId("inbox_button"), "onClick", function() { ... });
Run Code Online (Sandbox Code Playgroud)

另外,要明确的是,你应该永远不要在dojo._base中使用dojo.require,这是dojo.js对你做出的承诺 - 它全部捆绑在一起.


Dan*_*iel 2

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

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

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