2012-05-15 38 views
0

我添加一個監聽器媒體API事件如下:爲什麼其中一個監聽器適用於Media API事件而不是另一個?

function addPlayListener() { 
    var video = document.getElementById("theVideo"); 
    video.addEventListener('play', function() {alert('play');}, false); // method a 
video.addEventListener('play', alert('play'), false); // method b 
} 
window.addEventListener('load', addPlayListener, false); 


<video id="theVideo" controls width="180" height="160" src="sample_mpeg4.mp4"> </video> 

使用方法的一切正常,但是使用方法B上面就會顯示警告網頁加載(和不當事件發生時顯示)。

爲什麼這樣,方法b的語法有什麼問題?

回答

0

根據addEvenListener文檔:

target.addEventListener(type, listener[, useCapture]); 

listener必須是:

  • 對象,實現EventListener接口,
  • JavaScript函數

alert()函數不返回任何對象,它實現了EventListener接口,也沒有Javascript function。簡單地說,alert不會返回任何內容。所以,你得到的是:

video.addEventListener('play', undefined , false); //method b 
0

addEventListener的第二個參數必須是「當發生指定類型的事件時接收通知的對象,它必須是實現EventListener接口的對象,或者只是一個JavaScript函數。在你的「方法b」中,警報立即被觸發,因爲它不在函數內,也不是實現EventListener接口的對象。方法A是普遍接受的語法。

0

method b中,對話框將立即顯示,因爲您首先調用它 - alert('play')addEventListener不能耽誤它的參數執行,轉而被傳遞的alertreturn價值 - 它不能做與:

// what's being passed after `alert('play')` is called 
video.addEventListener('play', true, false); 

method afunction() { ... }正是你需要什麼延遲alert('play')的電話直到事件被觸發。函數本身被傳遞給addEventListener,並且可以在任何次數後調用(即每次觸發事件)。而且,每次通話,它都會執行其內容。

相關問題