Javascript音频分层eventListener HTML5在多次迭代中失败
Javascript audio layering eventListener HTML5 fails on multiple iterations
我正在制作一个音频函数,用于一个简单的脚本,以播放钢琴上的音符。对于音频标签在播放完之前无法处理新请求的问题,我的解决方案是为随后的每次点击创建一个新的音频元素,然后设置监听器在播放完声音后删除该元素。它工作得很好,只是我的事件侦听器似乎被覆盖了,所以只跟踪声音的最后一次迭代,使许多音频元素保持完整和不活动。
代码:
var x = 0;
function playSound(){
x = x + 1;
var na = document.createElement('audio');
na.setAttribute('id','cycle'+x);
document.body.appendChild(na);
var ta = document.getElementById('cycle'+x);
var ns = document.createElement('source');
ns.setAttribute('src','notify.wav');
ta.appendChild(ns);
document.getElementById('cycle'+x).addEventListener('ended', function(){
document.body.removeChild(document.getElementById('cycle'+x));
try{document.getElementById('cycle'+x).remove();}
catch(err){}});
ta.play();
}
并将声音预加载到页面中:
<audio id="preloader" preload="auto"><source src="notify.wav"></source></audio>
我希望每个生成的音频元素都有单独的事件侦听器,这样当文件播放后,该元素就会被删除。
您的问题源于引用问题-通过示例代码中使用的方法,您无法在侦听器的当前范围中获取所需的元素。
Safari的控制台告诉我:
[Error] NotFoundError: DOM Exception 8: An attempt was made to reference a Node in a context where it does not exist.
(anonymous function) (_display, line 33)
显然,所有事件侦听器都正确启动。
当然,你可以进行大规模的搜索,以找到背后的真正原因,但既然你正在寻找解决问题的方法,这应该做到:
删除这些行:
document.body.removeChild(document.getElementById('cycle'+x));
try{document.getElementById('cycle'+x).remove();}
catch(err){}});
并将其替换为:
this.remove();
事件侦听器回调将始终以this
的形式提供相关元素。这是获得有效推荐人的最安全途径。
相关文章:
- 如何在javascript中迭代数字列表
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 如何迭代Array.prototype函数
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 在ejs-partial中对JSON对象进行迭代
- 如何在DataTables 2.1中迭代对象数组
- 使用递归属性迭代保留属性结构
- 正在停止.在jquery中的特定时间间隔内,每次迭代的每次执行
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- 主干-从模板中迭代的集合中获取特定的模型
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 什么's是在javascript中迭代项的最佳方式
- 为什么这只是迭代 HTMLCollection 的奇怪元素
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- Babel编译错误:找不到模块核心js/library/fn/get迭代器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- Javascript音频分层eventListener HTML5在多次迭代中失败
- 迭代失败
- PHP循环中的SQL查询在第n次迭代后失败
- setTimeout在第一次迭代后失败