事件侦听器和处理程序之间的关系

伊卡加诺维奇

假设我同时设置xhr.onreadystatechange = handler和调用xhr.addEventListener('readystatechange', listener)了同一个XMLHttpRequest对象。首先叫哪个?如果listener通话event.stopImmediatePropagation(),将handler通话

是否指定了结果行为,还是取决于浏览器实现?

伊卡加诺维奇

由于没有得到权威的答案,所以我尝试了一下。

https://jsfiddle.net/6fkhc9om/

document.getElementById("basicXHRButton").addEventListener("click", function() {
  // Loading the jQuery code
  request = new XMLHttpRequest();
  request.open("GET", "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js", true);
  request.send(null);

  // this listener suppresses onload handler
  // if this is commented out, onload handler will be invoked
  request.addEventListener("load", function(event) {
    alert("load listener 1");
    event.stopImmediatePropagation();
  });

  request.onreadystatechange = function() {
    console.log(request.responseText);
    alert("onreadystatechange handler " + request.readyState);
  };

  // this listener does not suppress load event listeners or handlers
  request.addEventListener("readystatechange", function(event) {
    alert("readystatechange listener 2 " + request.readyState);
    event.stopImmediatePropagation();
  });

  request.onload = function() {
    console.log(request.responseText);
    alert("onload handler");
  };

  // this listener doesn't suppress onload handler
  request.addEventListener("load", function(event) {
    alert("load listener 2");
    event.stopImmediatePropagation();
  });


  request.addEventListener("load", function(event) {
    alert("load listener 3");
  });

});

至少对于当前版本的Chrome(版本76.0.3809.132)和Firefox(版本69.0),我注意到设置事件处理程序与添加事件侦听器相同。即,设置事件处理程序之前添加的事件侦听器可以使用stopImmediatePropagation();抑制处理程序在处理程序之后添加的事件侦听器不会抑制处理程序。同样,一种类型的事件不会抑制另一种类型的事件/处理程序。例如,即使readystatechange监听器是较早注册的,它也不会抑制load监听器或onload处理程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java自定义事件处理程序和侦听器

如何检查是否有附加到元素/文档的JavaScript事件侦听器/处理程序?

java事件,处理程序和侦听器的问题

JavaFx:侦听器和/或绑定处理

Axon如何添加事件侦听器/拦截器以在事件到达处理程序之前对其进行拦截?

Symfony2自定义事件调度程序和侦听器

Laravel 5-事件处理程序和侦听器之间的混淆

事件,侦听器,作业,队列之间的Laravel差异

jQuery-嵌套与非嵌套过渡和动画事件处理程序/侦听器

重构以减少多个事件侦听器之间的重复

整理和多个事件侦听器

Blazor,事件侦听器作为@functions部分中的内联委托或处理程序

处理多个页面上的事件侦听器

删除处理程序不在范围内的事件侦听器

处理Kotlin中事件总线的通用侦听器

如何使用Javascript验证和PHP处理事件侦听器

setState之后事件侦听器处理程序中的状态值错误

处理程序的无消息侦听器

如何在会话和路由器侦听器之间注册事件侦听器?

处理多个事件侦听器的最佳方法

Laravel事件处理程序和侦听器

JavaFX事件/侦听器/处理程序

Hashchange事件侦听器在将事件处理程序附加到事件之前进行侦听

当处理程序需要接收回调函数时,删除jQuery事件侦听器

反应流和事件侦听器之间有什么区别?

在全局事件上处理多个侦听器

处理大量事件侦听器?

React:与事件侦听器相关的批处理状态更新

事件侦听器和转换 JS