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对你做出的承诺 - 它全部捆绑在一起.
回答我自己的问题:永远不要低估 dojo.addOnLoad 的价值!
我觉得由于该按钮被用作一个小部件,它的 ID 直到 Dojo 完成加载后才注册,并且由于连接代码不在 addOnLoad 块内,因此它找不到(尚未加载)按钮。那么,该方法在每次单击事件时触发的原因是 Dojo 在 connect() 函数中处理空对象的方式:它忽略它们并使用 dojo.global (Dojo 的 document.window 版本)作为目的。
我希望这对可能遇到类似问题的其他人有所帮助!