2013-01-18 35 views
3

我正在調試一個問題,在我的JavaScript代碼中沒有正確設置變量。經過一些研究,我發現變量沒有被填充,因爲它從一個不存在的事件屬性中獲取它的值。在這種情況下,它從event.currentTarget派生出它的值,該值奇怪地爲null。event.currentTarget問題

所以我現在有點困惑。我總是儘管event.currentTarget總是指向觸發事件的偵聽器的任何元素。那麼在什麼情況下event.currentTarget實際上是空的?

+1

如果以編程方式觸發事件或者您使用的是較舊的IE版本,它將是'undefined'或'null'。 –

+0

下面是一個令人驚歎的演示,展示瞭如何以及何時設置所有這些事件屬性:http://liouh.com/jsevents/ –

+0

如果您還沒有做過,我會建議使用類似jQuery的庫進行事件處理,以避免遇到問題不同的瀏覽器設置不同的屬性。 –

回答

3

好的,我終於明白了這一點。

問題在於事件處理的方式。正如你在下面看到的,事件對象本身不僅要由其各自的處理函數來處理,它也將被另一個函數處理,該函數僅在處理程序中的AJAX調用成功返回時才被調用。但是,一旦成功函數在AJAX調用下執行,事件對象就會丟失一些上下文,即它的currentTarget屬性。我認爲這是因爲我們並不直接在處理程序的範圍內,一旦瀏覽器開始在成功函數中執行代碼。

$('#element').click(function(e) { 

    // bunch of lines of code here 

    $.ajax({ 
     type: 'POST', 
     url: // url, 
     ..., 
     success: function(response) { 

      // more lines of code here 

      callAnotherFunction(e); 
      // When we invoke the above function, we pass the event in as a 
      // parameter, but the event has already lost some of its context 
      // due to scope change. 
     } 
    }); 

}) 
+0

我注意到了同樣的事情。我在使用'event'完成函數之前不會「等待」AJAX調用來「修復」它,但這並不總是一個好的解決方案。我想知道爲什麼會發生這種情況,以防將來遇到這種情況。對於記錄來說,一旦AJAX調用完成,'event.currentTarget'就爲空,並且奇怪的是'event.target'仍然使用與調用事件時相同的元素來填充。我使用角度,所以也許棱角分明,在你的情況下,jQuery,改變了事件? – trysis

+0

在異步操作之後管理事件時也是如此。 –