求助:JSfiddle中音频数组播放完毕后重复第一首的原因排查
问题原因分析
我帮你排查了代码逻辑,问题出在按钮点击事件的分支处理上:当i超过音频数组长度时,你写的代码会主动把i重置为0,然后直接播放第一首音频。如果你的音频播放结束后会自动触发按钮点击(比如通过监听ended事件来自动切换下一首),那当第三首播放完毕时,就会触发这个分支逻辑,导致第一首被重复播放。
举个流程例子:点击按钮播放第一首→i变为1→第一首播完自动触发点击→播放第二首→i变为2→第二首播完触发点击→播放第三首→i变为3→第三首播完触发点击→此时i >= 3,代码重置i=0并播放第一首——这就是你看到“自动重复第一首”的核心原因。
另外还要提个小细节:你代码里的lastPlayedFile[1].currentTime索引写错了,jQuery对象取原生DOM元素应该用[0],[1]会导致这个重置时间的操作无效。
解决方案
如果你的需求是播放完所有音频后停止,不再自动重复,修改按钮点击事件的else if分支即可,去掉自动播放第一首的操作,只重置状态:
$(".click").click(function(){ if(lastPlayedFile !== null) { lastPlayedFile[0].currentTime = 0; // 修正索引错误 lastPlayedFile.trigger('pause'); } if (i< audioArray.length){ lastPlayedFile = audioArray[i]; audioArray[i].trigger('play'); i++; } else if (i>=audioArray.length){ // 只重置i为初始状态,不自动播放,等待用户下次点击 i = 0; lastPlayedFile = null; }; });
如果你的代码里还有监听ended事件自动切换下一首的逻辑(比如类似下面的代码),也要补充判断,避免播放完所有音频后继续触发点击:
// 假设你有自动切换下一首的逻辑 audioArray.forEach(function(audio) { audio.on('ended', function() { if (i < audioArray.length) { $(".click").trigger('click'); } else { // 所有音频播放完成,重置状态 i = 0; lastPlayedFile = null; } }); });
这样修改后,第三首播放完毕后就会停止,不会自动重复第一首,只会重置状态等待用户下次点击按钮重新开始播放。
内容的提问来源于stack exchange,提问作者Jorge Gutierrez Marco
相关产品推荐
相关产品推荐

