0

我正在为 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> 

使用方法 a 一切都按预期工作,但是使用方法 b 会在页面加载后立即显示警报(并且在事件触发时不显示)。

为什么会这样,方法 b 的语法有问题吗?

4

3 回答 3

0

addEventListener的第二个参数必须是“当指定类型的事件发生时接收通知的对象。这必须是实现 EventListener 接口的对象,或者只是一个 JavaScript 函数。” 在您的“方法 b”中,警报会立即触发,因为它不在函数内,也不是实现 EventListener 接口的对象。方法 A 是普遍接受的语法。

于 2012-05-15T17:05:55.557 回答
0

method b中,对话框立即显示,因为您首先调用它 -- alert('play')addEventListener不能延迟其参数的执行,而是传递alert'return值——它不能做太多事情:

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

function () { ... }inmethod a正是您需要延迟调用alert('play')直到事件被触发。a 函数本身被传递给addEventListener,并且可以在以后多次调用(即,每次触发事件时)。并且,每次调用时,它都会依次执行其内容。

于 2012-05-15T17:07:04.653 回答
0

根据addEvenListener文档:

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

listener一定是:

  • 对象,实现EventListener接口,
  • JavaScript 函数

alert()函数不返回任何实现EventListener接口的对象,也不返回 Javascript function。简单地说,alert不返回任何东西。所以,你得到的是:

  video.addEventListener('play',  undefined , false);   //method b
于 2012-05-15T17:07:07.497 回答