2009-01-28 29 views
1

我已經定義了onclick事件。我想添加額外的回調函數,該函數將在BEFORE已定義的回調函數中調用。在隊列頭部添加事件

  • 如何在具體事件類型的隊列頭部添加事件?

回答

0

你在使用jQuery框架嗎?我目前正與ExtJS的工作,我發現了一類可以使用或複製

讓我們來看看在http://extjs.com/deploy/dev/docs/分機> eventmanager進行>的removeAll()

的removeAll(串/ HTML元素EL): void刪除所有來自 元素的事件處理器。通常,你會贊成 調用此版本使用 Ext.Element.removeAllListeners 直接的元素。參數:EL: 字符串/ HTML元素的ID或HTML 元素從其中刪除事件 返回:Void

我想你可以設置爲HTML元素的標籤body關閉所有事件。 (沒有測試遺憾)

從這裏下載http://extjs.com/products/extjs/build/>選擇jquery適配器,如果你正在使用jquery> extcore就足夠了(它包含EventManager.js)。

在其他的方式,比如crescentfresh(回答N°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我可以幫,如果我的回答很有用,就投我一票。

1

如果使用attachEvent IE瀏覽器,你不能保證在事件被觸發順序。見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

您可以簡單地停止的事件監聽器,只需加載使用正確的PARAMS此示例函數:

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。

一個庫來調試事件,也許有用。

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可惜的是,我不能投票,只有兩個回信,我不能因缺乏信​​譽的提高有用的標記您的回覆,我不能標記多個答案可以接受的。所以,請原諒我。愚蠢的論壇引擎,但真的很酷的人在這裏