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

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

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

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

有帮助吗?

解决方案

我通常做的是在创建手柄时保存手柄,以便稍后断开它们。类似的东西:

 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 上有类似的代码示例

其他提示

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

如果您希望稍后断开它们,则必须将它们存储在某处。

和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'和我的草图是否有助于您的情况。如果没有,请提供更多详细信息。

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

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

在此处查看此操作。但是,仅从IE9 for Internet Explorer支持removeEventListener。它应该适用于所有其他主流浏览器。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top