为什么其中一个侦听器适用于媒体 API 事件,而另一个则不适用于媒体 API 事件
Why does one of these listeners work for a Media API event but not the other?
我正在为媒体 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 的语法有问题吗?
根据 addEvenListener 文档:
target.addEventListener(type, listener[, useCapture]);
listener
必须是:
- 对象, 实现
EventListener
接口, - JavaScript 函数
alert()
函数不返回任何实现EventListener
接口的对象,也不返回Javascript function
。简单地说,alert
不返回任何内容。所以,你得到的是:
video.addEventListener('play', undefined , false); //method b
addEventListener 的第二个参数必须是"在发生指定类型的事件时接收通知的对象。这必须是实现 EventListener 接口的对象,或者只是一个 JavaScript 函数。在您的"方法 b"中,警报会立即触发,因为它不在函数内,也不是实现 EventListener 接口的对象。方法 A 是普遍接受的语法。
在 method b
中,对话框会立即显示,因为您首先调用它 - alert('play')
。 addEventListener
不能延迟其参数的执行,而是传递alert
的return
值 - 它不能做太多事情:
// what's being passed after `alert('play')` is called
video.addEventListener('play', true, false);
method a
中的function () { ... }
正是延迟alert('play')
调用直到触发事件所需的。a函数本身被传递给addEventListener
,并且可以在以后调用任意次数(即事件的每个触发器)。并且,每次调用时,它都会依次执行其内容。
相关文章:
- Jquery事件处理程序仅适用于匿名函数
- jQuery点击事件仅适用于横向(iPhone)
- 如何使鼠标事件仅适用于外部DIV
- jQuery事件在Mozilla上不起作用,并且适用于其他浏览器
- 为什么其中一个侦听器适用于媒体 API 事件,而另一个则不适用于媒体 API 事件
- 鼠标悬停事件仅适用于上次创建的传单地图
- 哪个 jQuery 事件处理程序适用于页面加载
- 如何使更改事件适用于使用 replaceWith 添加的 html 的单选按钮
- 在backbonejs视图中,keypress/keyup/keydown事件是否仅适用于输入,而不适用于其他元素
- 点击事件只适用于第二个帖子
- 动态按钮点击事件仅适用于最后一个按钮
- Window onresize事件仅适用于移动设备
- onclick事件仅适用于按钮,而不适用于与按钮一起使用的glyphicon
- jquery悬停仅适用于单击事件
- 是否resize()事件只适用于宽度?
- 我如何让这个HTML5 Canvas绘画应用程序同时适用于触摸和鼠标事件?
- Javascript,只适用于事件处理程序
- 父节点上的事件委托仅适用于某些事件
- 如何在键事件处理程序中获得HTML文本元素的新值,也适用于特殊键
- 动态添加点击事件复选框,只适用于第一个复选框JQUERY