同一对象上的多个事件侦听器不起作用

Multiple event listener on the same object not working

是否可以让两个监听器监听同一个事件?我有一个事件监听器监听 oncanplay 视频事件,在其他一些 class 中,在这个例子中是测试 class,我必须监听相同的事件。

<!DOCTYPE html> 
<html> 
<body> 

<button onclick="playVid()" type="button">Play Video</button>
<button onclick="pauseVid()" type="button">Pause Video</button><br> 

<video id="myVideo" width="320" height="176" autoplay>
  <source src="mov_bbb.mp4" type="video/mp4">
  <source src="mov_bbb.ogg" type="video/ogg">
  Your browser does not support HTML5 video.
</video>

<script> 

const test = () => {

  vid.oncanplay = function() {
  console.log("CAN PLAY 2!")
};
}

var vid = document.getElementById("myVideo"); 
test();

  vid.oncanplay = function() {
  console.log("CAN PLAY 1!")
};

function playVid() { 
  vid.play(); 
} 

function pauseVid() { 
  vid.pause(); 
} 
</script> 

</body> 
</html>

在这种情况下,只会触发 CAN PLAY 1。如果我删除 CAN PLAY 1 监听器,CAN PLAY 2 将被解雇。我可以同时触发这两个事件吗?

只有分配的最后一个事件处理程序获得 运行,因为您将它们分配为属性。 请尝试使用 addEventListener()

oncanplay是一个属性对象,可以多次赋值,但只有最后一次赋值才有意义,因为你覆盖了值。

就像...

a=2;
a=1;
console.log(a);
//as you'd expect, it would output the value of 1

正如所建议的那样,您可以使用

在对象上放置多个事件侦听器
vid.addEventListener("canplay",
                     function() {
                        console.log("CAN PLAY 1!");
                      });

...因为 addEventListener 不会覆盖以前创建的事件侦听器。

此外,请记住,使用匿名函数执行此操作将使以后很难删除事件侦听器;因为,作为匿名,没有命名引用允许您在 removeEventListener 请求期间访问它。