2016-09-03 87 views
0

我有一個對象:jQuery的事件衝突

var myObject = { 
    open : function() { 
     console.log('Object open'); 

     $(this).trigger('open'); 
    } 
}; 

$(myObject).on('open', function() { 
    console.log('Open event received'); 
}); 

myObject.open(); 

此代碼拋出一個「太多遞歸」。

的問題是觸發調用該方法,如果我重新命名open方法,這個工程:

var myObject = { 
    _open : function() { 
     console.log('Object open'); 

     $(this).trigger('open'); 
    } 
}; 

$(myObject).on('open', function() { 
    console.log('Open event received'); 
}); 

myObject._open(); 

這是否有道理的人?

回答

0

那麼當你嘗試再次觸發'open'時,你創建了一個遞歸循環。
遞歸循環是一種重複調用自身的函數,直到發生「stackoverflow」錯誤(沒有雙關意圖)。這是一種更有效的循環方式。
在第二種情況下,您觸發_open,然後函數嘗試觸發'open'事件,這會觸發on('open')偵聽器。那麼簡單。

+0

是的,我知道,但是這不是我所期待的,當我說的對象聽衆,我預計jQuery的觸發事件,而不是調用該方法,爲什麼?因爲如果我想調用我的對象的方法,我只是做myObject.myMethod() – user3763667

+0

因爲你的方法是與你的事件相同的名稱jquery可能認爲他們都是事件,當你觸發事件時,它也觸發該函數以及 – Nicolas

+0

ok,如此愚蠢 ! jQuery真的很爛 – user3763667

0

在你的第一個例子

$(this).trigger('open');

遞歸觸發myObject.open函數的調用。

在第二個

$(this).trigger('open'); 

觸發新的自定義事件「開放的」,然後你處理與您通過()方法定義的處理程序此事件。

+0

是的,這是我知道的部分,但我真的不明白爲什麼jQuery調用方法:) – user3763667

0

所以這聽起來像你試圖爲你的函數執行時創建一個事件監聽器?

如果是這樣,我就是這樣處理了許多這類事件的。我使用綁定到文檔的自定義事件,以便它們在全局級別可用。

JS小提琴:https://jsfiddle.net/7eaoe1hp/

var myObject = { 
     open : function() { 
      console.log('Object open'); 

      $(document).triggerHandler('open'); 
     } 
    }; 

    $(document).on('open', function(){ 
     console.log('Open event received'); 
    }); 

    myObject.open(); 
+0

是的,但我不能改變我的結構爲jQuery錯誤。我的方法「開放」觸發「開放」事件,就這樣。所以唯一的方法是在()off()和trigger()附加對象上創建一個替代 – user3763667