如果您没有在dojo.connect期间返回的“句柄”,如何删除dojo连接事件?
我的示例涉及动态地将一组事件分配给一组对象。 (为简单起见,事件是onclick和ondblclick,对象是表中的行)
因此,在页面设置期间,事件连接到每一行(onclick,ondblclick)。现在,根据用户的期望/动作,需要从一行中删除一个事件。但原来的手柄已不再可用。因此,以下内容不起作用:dojo.disconnect(row, "onclick", ??*)
。如何在不破坏原始行结构的情况下解决这个问题?
当然,非常感谢任何帮助。
答案 0 :(得分:10)
您的问题的答案是,如果您丢失了在dojo.connect操作期间返回的“句柄”,则无法断开事件。除非你准备好对dojo代码进行大量的黑客攻击。
如果您希望稍后断开它们,则必须将它们存储在某处。
答案 1 :(得分:9)
和Seth一样,我有删除事件的模式 - 我收集数组中的句柄(伪代码):
var handles = [
dojo.connect(...),
dojo.connect(...),
dojo.connect(...)
];
如果我动态连接,我只需收集它们:
var handles = [];
...
handles.push(dojo.connect(...));
...
handles.push(dojo.connect(...));
如果我以常规方式连接多个事件,我可以使用dojo.map()
:
var handles = dojo.map(["click", "ondblclick"], function(evt){
return dojo.connect(node, evt, ...);
});
整洁的部分是,以后我可以用一个方便的单行隔离它们:
dojo.forEach(handles, dojo.disconnect);
在您的情况下,您可以使用Seth所示的字典来完成相同的操作:
var handles = {};
...
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){
return dojo.connect(node, evt, ...);
});
所以稍后您可以断开这样的处理程序:
dojo.forEach(handles[node.id], dojo.disconnect);
看看Seth'和我的草图是否有助于您的情况。如果没有,请提供更多详细信息。
答案 2 :(得分:8)
我通常做的是在创建手柄时保存手柄,以便稍后断开它们。类似的东西:
var connects = {};
// then later on
var node = dojo.create(....); // or someting else that gives you a node
dojo.forEach( ['click','ondblclick' ], function( evt, idx ) {
if (!connects[node.id]) {
connects[node.id] = [];
}
connects[ node.id ][idx] = dojo.connect( node, evt, function(evt) { .... });
});
然后,你可以断开像:
dojo.forEach( connects[node.id], function( handle ) {
dojo.disconnect( handle );
});
上有类似的代码示例
答案 3 :(得分:2)
即使dojo无法做到这一点,您也可以使用标准JavaScript删除命名函数:
node.removeEventListener ("click", clickFunction, false);
See it in action here。但是,仅从IE9 for Internet Explorer支持removeEventListener。它应该适用于所有其他主流浏览器。
答案 4 :(得分:0)
如果事件连接到Dijit小部件,您可以覆盖事件上的所有处理程序,如下所示:
dijit.byId(widgetid).onClick = function() {
// click handler or empty function goes here
}
附加到该窗口小部件的click
处理程序的任何和所有函数都将被新的单击处理程序替换。