Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript addEventListener是否在while循环中工作?_Javascript_Audio_While Loop_Dom Events_Addeventlistener - Fatal编程技术网

Javascript addEventListener是否在while循环中工作?

Javascript addEventListener是否在while循环中工作?,javascript,audio,while-loop,dom-events,addeventlistener,Javascript,Audio,While Loop,Dom Events,Addeventlistener,我正在尝试循环多个元素,以更改单个音频元素的音频源,播放它,一旦结束,更改新的src并播放它,直到循环已通过所有元素: var contentAudio = new Audio();; function audioLoop(index, audioModel) { while (index < audioModel.length) { var audio = contentAudio; audio.src = audioModel[index].

我正在尝试循环多个元素,以更改单个音频元素的音频源,播放它,一旦结束,更改新的src并播放它,直到循环已通过所有元素:

var contentAudio = new Audio();;

function audioLoop(index, audioModel) {

    while (index < audioModel.length) {
        var audio = contentAudio;
        audio.src = audioModel[index].src;
        audio.play()
        audio.addEventListener('ended', 
            function () {
                index++;
            });
    }
    console.log('done');

}
var contentAudio=new Audio();;
功能audioLoop(索引、audioModel){
while(索引

添加事件侦听器似乎不起作用。音频无法播放,我陷入了无休止的循环。永远不会触发音频结束事件。我做错什么了吗?有更好的选择吗?

while
循环是同步的,因此它不会等待您的
结束
事件。以下是我的建议:

var contentAudio = new Audio();

function audioLoop(index, audioModel) {

    (function process(done) {
      if (index >= audioModel.length) {
        done(); return;
      }
      var audio = contentAudio;
      audio.src = audioModel[index].src;
      audio.play()
      audio.addEventListener('ended', function () {
        index++;
        process(done);
      });
    })(function () {
      console.log('done');
    });

}

也是
audioModel
阵列。如果是这样,我认为您应该使用
audioModel[index].src
而不是
audioModel.src
while循环是同步的,因此它不会等待
事件结束。以下是我的建议:

var contentAudio = new Audio();

function audioLoop(index, audioModel) {

    (function process(done) {
      if (index >= audioModel.length) {
        done(); return;
      }
      var audio = contentAudio;
      audio.src = audioModel[index].src;
      audio.play()
      audio.addEventListener('ended', function () {
        index++;
        process(done);
      });
    })(function () {
      console.log('done');
    });

}

也是
audioModel
阵列。如果是这样的话,我认为您应该使用
audioModel[index].src
而不是
audioModel.src

是的,它是一个数组,正如您所说,它应该是
audioModel[index].src
感谢您指出了这一点。有没有办法取消事件侦听器的注册?您可以使用
removeEventListener
是一个数组,是的,正如您所说,它应该是
audioModel[index]。src
感谢您指出这一点。有没有办法注销事件侦听器?您可以使用
removeEventListener