我在使用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;"}))
});
然而,当按钮被点击时,ANY onclick事件触发函数,而不是执行函数,我最终得到了很多子容器。
尽管我非常确定.connect()函数应该作为dojo的基本功能的一部分,但我已经明确地“要求”它:
dojo.require("dojo._base.connect");
你知道为什么会这样吗?
2条答案
按热度按时间9njqaruj1#
正如您所说,如果在DOM准备好之前运行该代码,dojo.byId(“inbox_button”)将返回null。所以你的连接实际上是在做:
..如果dojo.connect的第一个参数为null,则将使用global或'window'对象。
但是,这只是这里的一个错误。您的button元素正在被小部件化,并变成了dijit. form. Button。所以你应该在这里连接到小部件的onClick方法,而不是节点的onclick:
另外,要明确的是,你永远不应该在dojo._base中要求dojo.require任何东西,这是dojo.js对你的承诺-它全部捆绑在一起。
yyhrrdl82#
回答我自己的问题:永远不要低估dojo.addOnLoad的价值!
我觉得由于按钮被用作一个小部件,它的ID直到Dojo完成加载之后才被注册,并且由于连接代码不在addOnLoad块中,所以它找不到(尚未加载的)按钮。那么,该方法在每个点击事件上触发的原因是Dojo在connect()函数中处理null对象的方式:它会忽略它们,而是使用dojo.global(Dojo的document.window版本)作为对象。
我希望这能帮助任何可能遇到类似问题的人!