我曾想知道为什么我的一些JavaScript不起作用,直到我发现音频事件没有冒泡到DOM树中,例如timeupdate
事件。
不让音频和视频标签的事件冒泡是否有合理的理由?
我曾想知道为什么我的一些JavaScript不起作用,直到我发现音频事件没有冒泡到DOM树中,例如timeupdate
事件。
不让音频和视频标签的事件冒泡是否有合理的理由?
document.addEventListener('play', function(e){
//e.target: audio/video element
}, true);
请注意,此事件不会冒泡,而是沿着DOM树向下传递,无法使用 stopPropagation
停止。
如果您想要将其与jQuery的.on/.off方法一起使用(例如具有命名空间和其他jQuery事件扩展),可以使用以下函数,该函数取自webshim库:
$.createEventCapturing = (function () {
var special = $.event.special;
return function (names) {
if (!document.addEventListener) {
return;
}
if (typeof names == 'string') {
names = [names];
}
$.each(names, function (i, name) {
var handler = function (e) {
e = $.event.fix(e);
return $.event.dispatch.call(this, e);
};
special[name] = special[name] || {};
if (special[name].setup || special[name].teardown) {
return;
}
$.extend(special[name], {
setup: function () {
this.addEventListener(name, handler, true);
},
teardown: function () {
this.removeEventListener(name, handler, true);
}
});
});
};
})();
用法:
$.createEventCapturing(['play', 'pause']);
$(document).on('play', function(e){
$('audio, video').not(e.target).each(function(){
this.pause();
});
});
body
全局注册事件监听器是有意义的,这样可以捕获文档内任何媒体元素触发的事件。 - Sergiu Dumitriuplay
监听器附加到例如body上,当任何<audio>
触发该事件时,函数将被执行。(这实际上是@Sergiu的想法。) - pimvdb