如果没有在dojo.connect期间返回的“句柄”,如何删除dojo连接事件?

时间:2009-07-31 20:13:36

标签: event-handling dojo disconnect

如果您没有在dojo.connect期间返回的“句柄”,如何删除dojo连接事件?

我的示例涉及动态地将一组事件分配给一组对象。 (为简单起见,事件是onclick和ondblclick,对象是表中的行)

因此,在页面设置期间,事件连接到每一行(onclick,ondblclick)。现在,根据用户的期望/动作,需要从一行中删除一个事件。但原来的手柄已不再可用。因此,以下内容不起作用:dojo.disconnect(row, "onclick", ??*)。如何在不破坏原始行结构的情况下解决这个问题?

当然,非常感谢任何帮助。

5 个答案:

答案 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 );
 });

dojocampus

上有类似的代码示例

答案 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处理程序的任何和所有函数都将被新的单击处理程序替换。