播放事件时音频事件未触发 jQuery
Audio event does not trigger jQuery on play event
我尝试对音频 play
事件执行函数:
jQuery('audio').on('play', function () { /* ... */ });
但是我的元素在执行这个函数时不存在,所以它没有被选中。相反,当我需要为动态添加的内容触发事件时,我习惯使用不同的语法:
jQuery('.constant-container').on('play', 'audio', function () {
/* ... */
});
其中.constant-container
不变。
但是这个解决方案似乎不起作用,音频元素也没有得到任何 click
事件。
这里是link to the bin.
前 4 个音频正确处理事件,但最后 4 个不正确。
显然是媒体事件(那些专门属于 音频 或 视频 的事件,例如 play
、pause
、timeupdate
, etc) 不要起泡。您可以在 this question 的答案中找到对此的解释。
所以使用他们的解决方案,我捕获了 play
事件,
jQuery.createEventCapturing(['play']);
jQuery('body').on('play', 'audio', function(){... // now this would work.
JS Bin demo
事件捕获代码(取自另一个SO答案):
jQuery.createEventCapturing = (function () {
var special = jQuery.event.special;
return function (names) {
if (!document.addEventListener) {
return;
}
if (typeof names == 'string') {
names = [names];
}
jQuery.each(names, function (i, name) {
var handler = function (e) {
e = jQuery.event.fix(e);
return jQuery.event.dispatch.call(this, e);
};
special[name] = special[name] || {};
if (special[name].setup || special[name].teardown) {
return;
}
jQuery.extend(special[name], {
setup: function () {
this.addEventListener(name, handler, true);
},
teardown: function () {
this.removeEventListener(name, handler, true);
}
});
});
};
})();
我尝试对音频 play
事件执行函数:
jQuery('audio').on('play', function () { /* ... */ });
但是我的元素在执行这个函数时不存在,所以它没有被选中。相反,当我需要为动态添加的内容触发事件时,我习惯使用不同的语法:
jQuery('.constant-container').on('play', 'audio', function () {
/* ... */
});
其中.constant-container
不变。
但是这个解决方案似乎不起作用,音频元素也没有得到任何 click
事件。
这里是link to the bin.
前 4 个音频正确处理事件,但最后 4 个不正确。
显然是媒体事件(那些专门属于 音频 或 视频 的事件,例如 play
、pause
、timeupdate
, etc) 不要起泡。您可以在 this question 的答案中找到对此的解释。
所以使用他们的解决方案,我捕获了 play
事件,
jQuery.createEventCapturing(['play']);
jQuery('body').on('play', 'audio', function(){... // now this would work.
JS Bin demo
事件捕获代码(取自另一个SO答案):
jQuery.createEventCapturing = (function () {
var special = jQuery.event.special;
return function (names) {
if (!document.addEventListener) {
return;
}
if (typeof names == 'string') {
names = [names];
}
jQuery.each(names, function (i, name) {
var handler = function (e) {
e = jQuery.event.fix(e);
return jQuery.event.dispatch.call(this, e);
};
special[name] = special[name] || {};
if (special[name].setup || special[name].teardown) {
return;
}
jQuery.extend(special[name], {
setup: function () {
this.addEventListener(name, handler, true);
},
teardown: function () {
this.removeEventListener(name, handler, true);
}
});
});
};
})();