Events 用Dojo解除事件绑定

Events 用Dojo解除事件绑定,events,binding,dojo,Events,Binding,Dojo,我已经使用.on()在Dojo中绑定了一个keydown事件。事件触发后,我需要解除事件绑定,但似乎没有任何效果。他们的文档说,该事件返回一个具有.remove()方法的对象,但我一辈子都不知道如何访问或应用该方法 任何帮助都将不胜感激 谢谢 query('#video-topics-input').on('keydown',function(e){ topicsDrop.keyDownFunc(e, e.keyCode); }); dojo.on返回一个事件句

我已经使用.on()在Dojo中绑定了一个keydown事件。事件触发后,我需要解除事件绑定,但似乎没有任何效果。他们的文档说,该事件返回一个具有.remove()方法的对象,但我一辈子都不知道如何访问或应用该方法

任何帮助都将不胜感激

谢谢

    query('#video-topics-input').on('keydown',function(e){
        topicsDrop.keyDownFunc(e, e.keyCode);
    });

dojo.on返回一个事件句柄,该句柄具有said.remove函数以解除侦听器的绑定。但是,在您的示例中,您使用的是在dojo.NodeList上操作的链式dojo.query

这基本上意味着您必须考虑数组,上面的示例将返回一个带有一个条目的数组,因为选择器是一个ID

要绑定eventlistener,请执行以下操作:

var eventHandles = query('#video-topics-input').on('keydown',function(e){
        topicsDrop.keyDownFunc(e, e.keyCode);
});
要解开这些标签:

eventHandles.forEach(function(handle) { handle.remove() });

一种更有效的方法是不使用query来查找byId,尽管dojo.on返回一个事件句柄,该事件句柄具有said.remove函数来解除侦听器的绑定。但是,在您的示例中,您使用的是在dojo.NodeList上操作的链式dojo.query

这基本上意味着您必须考虑数组,上面的示例将返回一个带有一个条目的数组,因为选择器是一个ID

要绑定eventlistener,请执行以下操作:

var eventHandles = query('#video-topics-input').on('keydown',function(e){
        topicsDrop.keyDownFunc(e, e.keyCode);
});
要解开这些标签:

eventHandles.forEach(function(handle) { handle.remove() });

一种更有效的方法是不使用query来查找byId,尽管@mschr的答案中需要添加一些内容

正如他所提到的,如果您是通过id查找的,那么您可能应该使用
dojo/dom
byid
函数,该函数返回单个domNode。如果这样做,还可以利用
dojo/on
once
函数,它触发事件处理程序一次,然后断开它的连接

require(['dojo/dom','dojo/on',function(dom,on){
  var node = dom.byId('video-topics-input');
  on.once(node, 'keydown',function(e){
    //some event handler that should only be fired once.
  });
});

@mschr的答案中有几点需要补充

正如他所提到的,如果您是通过id查找的,那么您可能应该使用
dojo/dom
byid
函数,该函数返回单个domNode。如果这样做,还可以利用
dojo/on
once
函数,它触发事件处理程序一次,然后断开它的连接

require(['dojo/dom','dojo/on',function(dom,on){
  var node = dom.byId('video-topics-input');
  on.once(node, 'keydown',function(e){
    //some event handler that should only be fired once.
  });
});

是的,我是一个Dojo新手……最后我使用dom.byId来选择元素,完成了上面的示例。谢谢,谢谢!这正是我想要实现的。很高兴能帮上忙:)实际上我通常有“onload”和“onunload”功能,有点像我的对象/页面的ctor/dtor模式。通过这种方式可以消除ajax应用程序中的memoryleakages是的,我是一个Dojo新手……我最终使用dom.byId来选择元素,完成了上面的示例。谢谢,谢谢!这正是我想要实现的。很高兴能帮上忙:)实际上我通常有“onload”和“onunload”功能,有点像我的对象/页面的ctor/dtor模式。这样可以消除ajax应用程序中的内存泄漏