2012-02-07 85 views
5

我目前正在爲我的大學開展一個項目。有一件事我需要做的是同步所有註冊的JavaScript事件處理程序與服務器。即我需要知道哪些元素具有特定的事件處理程序。JavaScript/jQuery:收聽新註冊的事件處理程序

我已經使用VisualEvent來找出哪些元素具有事件處理程序,它的工作真的很棒。

但我需要的是有一個事件監聽器,每次事件處理器被註冊爲一個DOM元素時被調用。

所以基本上每次調用類似$("#foo").click(...)$("#foo").bind(...)的東西時,我都需要獲取這個元素的新事件處理程序已經註冊的信息。

反之亦然從DOM元素中刪除事件處理程序時,我需要一個偵聽器,但對於第一個原型,這不是強制性的。

有沒有辦法可以將處理程序全局附加到所有事件處理程序註冊?

如果您需要更多信息,請不要猶豫,以發表評論。

在此先感謝您的幫助!

最好的問候, 羅伯特

+1

爲什麼服務器需要知道? – zzzzBov 2012-02-07 14:11:14

+0

這是一個遠程控制網站的研究項目的一部分。所以服務器需要知道哪些元素是可點擊的。 – 2012-02-07 14:12:43

+0

我確定有更好的方法來解決這個問題,但是我對這個問題的瞭解不夠多,不會給你任何好的建議。 – zzzzBov 2012-02-07 14:19:34

回答

8

如果你正在使用jQuery 1.7+,所有的方法來連接事件經過jQuery.fn.on,所以它是壓倒一切的是功能和去野生一個簡單的例子;

(function() { 

    var old = jQuery.fn.on; 

    jQuery.fn.on = function (events, selector, data, handler) { 
     // Ensure you still attach the events 
     var result = old.apply(this, arguments); 

     // Now do your own thing 

     // Inside here, `this` refers to the jQuery object on which `on` was invoked; 
     // it's not a specific element like it normally is within jQuery. You then 
     // therefore use something like `this.each(function() { /* this */ }); to 
     // target each element in the set. 

     // You might want to normalize the variables, as selector and data are optional, 
     // and events can be an object or string 
     jQuery.post('/spy.php', { 
      events: events, 
      selector: selector, 
      data: data 
     }, jQuery.noop); 

     return result; // keep the signature of `on`, and return the value `on()` *would* have done. 
    }; 

}()); 

如果你正在使用jQuery < 1.7不能升級,你可以做一些類似上述的東西,但一定要覆蓋bind()live()delegate()

+2

雖然您仍然需要一些方法來識別事件所附的元素。不知道如何才能工作,除非每個元素在標記中有一個唯一的ID。如果是這種情況,你可以在帖子中使用'elements:this.map(function(){return this.id;})。get()。join(「,」)'。 – 2012-02-07 14:25:54

+0

這完美的作品,非常感謝你馬特和戴夫! :) – 2012-02-07 14:49:34

相關問題