在队列的头部添加事件

时间:2009-01-28 09:59:38

标签: javascript events

我已经定义了onclick事件。我想添加额外的回调函数,该函数将在已定义的回调之前调用。

  • 如何在具体事件类型的队列头部添加事件?

6 个答案:

答案 0 :(得分:1)

如果您对IE使用attachEvent,则无法保证触发事件的顺序。见http://msdn.microsoft.com/en-us/library/ms536343(VS.85).aspx

  

如果您附加多个功能   在同一个对象上的相同事件,   函数以随机顺序调用,   在对象的事件之后立即   处理程序被调用。

(我实际上已经看到事件以相反的顺序调用,而不是随机调用)。无论如何,图书馆通常倾向于使用attachEvent深层次,所以你遇到了同样的问题。

话虽如此,如果您可以检查节点是否有“点击”处理程序(例如,您的标记中节点上有“onclick”属性设置),那么可以放置“你的“领先于他们的”:

var nodes = document.getElementsByTagName('*'); // collect your nodes however
for(var i=0; i < nodes.length; i++) {
    var node = nodes[i];
    if(!node.onclick)
        continue;

    // At this point we have a node with an "onclick" attr.
    // Hijack onclick to do something else first.
    var original = node.onclick;
    node.onclick = function() {
        doSomethingElse();
        return original.apply(this, arguments);
    }
}

有关如何检查其他库中的节点事件(如果您使用的话),请参阅this answer。您也可以将doSomethingElse()用于这些库。

答案 1 :(得分:1)

超级。这让我看了jquery doc,我发现将crescentfresh的解决方案与jQuery的unbing()方法(Extjs.removeAll()的肛门)相结合将解决我的问题。

所以,最后我有这个:

this.onclick = function( e ) 
        if ( /*trigger clause*/ true ) { 
          //cancel all events
          $(this).unbind();
          return false;
        } else {
          //continue processing  
          return original ? original.apply(this, arguments) : true;
        }
      }

感谢你们的建议!

PS这个混蛋做了这个糟糕的回复编辑器??!在这里贴一些代码很头疼。

PPS不幸的是,我不能投票支持两个回复,由于缺乏声誉,我无法为你的回复提出有用的标记,我不能标记多个可接受的答案。所以,请原谅我。愚蠢的论坛引擎,但真的很酷的人在这里

答案 2 :(得分:0)

addEventListener可让您添加其他活动。请注意,在IE中,您必须使用attachEvent。

这不会让您定义事件的顺序 - 显然是can't predict the order the events will be fired in。因此,如果您真的想要一个事件的可预测事件队列,您将不得不自己实现它。

答案 3 :(得分:0)

您可以使用preventDefault()停止事件的默认操作,或停止使用stopPropagation()传播嵌套事件,以便仅触发您的特定事件。

但是在不使用setTimeout()的情况下本地暂停或延迟事件,停止,保存状态并稍后在队列中重新触发是不可能的。

答案 4 :(得分:0)

你在使用jquery框架吗?我目前正在使用extjs,我找到了一个可以使用或复制的课程

让我们看看http://extjs.com/deploy/dev/docs/ Ext&gt; EventManager&gt;的removeAll()

  

removeAll(String / HTMLElement el):   void从中删除所有事件处理程序   元件。通常你会使用   Ext.Element.removeAllListeners   直接在一个元素上赞成   叫这个版本。参数:el:   String / HTMLElement id或html   要从中删除事件的元素   返回:void

我认为您可以将标记body设置为HTMLElement以关闭所有事件。 (没有测试过抱歉)

在此下载http://extjs.com/products/extjs/build/&gt;如果您正在使用jquery&gt;选择jquery适配器extcore就足够了(它包含EventManager.js)。

另一方面,像crescentfresh(回答4号),我把这个示例代码应用于所有节点事件:

var nodes = document.getElementsByTagName('*'); // collect your nodes however
for(var i=0; i < nodes.length; i++) {
     var node = nodes[i];
     Ext.EventManager.removeAll(node);
    }
}

如果您在使用我可以提供帮助的extjs时遇到问题,请告诉我,如果我的回答有用,请告诉我。

答案 5 :(得分:-1)

您只需使用正确的参数加载此示例函数即可停止事件侦听器:

   function removeEvent(obj,type,fn){
  if(obj.removeEventListener) obj.removeEventListener(type,fn,false);
  else if(obj.detachEvent){
    obj.detachEvent("on"+type,obj[type+fn]);
    obj[type+fn]=null;
    obj["e"+type+fn]=null;
  }
}

此外,您可以在杀死其他侦听器的事件中触发àsetTimeout,并在外部或使用其他setTimeout逐个重新启用侦听器。

用于调试事件的库,可能很有用。