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

时间:2010-06-09 17:49:54

标签: button dojo onclick connect

我使用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");

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

2 个答案:

答案 0 :(得分:12)

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

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

..如果dojo.connect的第一个arg为null,则将使用全局或“window”对象。

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

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

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

答案 1 :(得分:2)

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

我觉得因为按钮被用作小部件,所以在Dojo完成加载之后它的ID才被注册,并且因为连接代码不在addOnLoad块中,所以它找不到(还没有)加载)按钮。因此,该方法在每个click事件上触发的原因是因为Dojo处理connect()函数中的null对象的方式:它忽略它们而是使用dojo.global(Dojo的document.window版本)作为对象

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