13

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

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

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

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

4

5 回答 5

10

您的问题的答案是,如果您丢失了在 dojo.connect 操作期间返回的“句柄”,就不可能断开事件。除非您准备好对 dojo 代码本身进行大量黑客攻击。

如果您想稍后断开它们,则必须将它们存储在某个地方。

于 2011-01-12T16:47:05.730 回答
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);

看看赛斯和我的草图是否对你有帮助。如果没有,请给我们更多细节。

于 2009-08-01T01:05:15.600 回答
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上有一个类似的代码示例

于 2009-07-31T20:55:46.850 回答
2

即使 dojo 没有办法做到这一点,您也可以使用标准 JavaScript 删除命名函数:

node.removeEventListener ("click", clickFunction, false);

在这里查看它的实际应用。但是,仅从 Internet Explorer 的 IE9 开始支持 removeEventListener。它应该适用于所有其他主要浏览器。

于 2013-04-16T04:02:18.970 回答
0

如果事件连接到 Dijit 小部件,您可以覆盖事件上的所有处理程序,如下所示:

dijit.byId(widgetid).onClick = function() {
    // click handler or empty function goes here
}

附加到该小部件的处理程序的任何和所有功能click都将被新的单击处理程序替换。

于 2016-02-19T18:34:20.923 回答