javascript - addEventListener 未附加到正确的范围

标签 javascript dom

我正在使用原生 DOM 的 addEventListener 事件,如下所示:

const domElement = document.getElementById('ember464');
domElement.addEventListener('click', dosomething);
this._listeners.push({target: domElement, type: 'click', callback: dosomething});

这注册了事件并将其存储在 _listeners 数组中,以便稍后可以清理。好消息是,此事件确实附加到 DOM,但尽管事件目标的范围明确仅限于单个按钮,但每当在文档上的任何地方检测到单击时,处理程序似乎都会触发! p>

我做错了什么吗?

附:这是浏览器检查器查看 _listener 数组...请注意,突出显示“目标”确实仅指向我尝试定位的按钮。 AKA,目标是 DOM 节点,而不是用于标识节点的选择器。

image

<小时/>

我现在查看了目标 DOM 元素上的调试器,并看到以下内容:

enter image description here

<小时/>

对于任何足够勇敢的人来说,这里有一个代码的工作演示。第二个按钮由“click”事件触发是本期的主题:

https://ui-animate.firebaseapp.com/

完整的源代码在这里:link

最佳答案

好的,问题出在我没有在问题中说明的一些代码中。现代浏览器都支持 DOM 方法 addEventListener,但为了支持只有 attachEvent 的旧版浏览器,我添加了以下抽象:

registerListener(target, type, callback) {
  const addListener = target.addEventListener || target.attachEvent;
  const eventName = target.addEventListener ? type : 'on' + type;

  addListener(eventName, callback);
},

问题是“this”上下文在调用中丢失了。所以我改为以下内容:

registerListener(target, type, callback) {
  const listenerFunction = target.addEventListener ? 'addEventListener' : 'attachEvent';
  const eventName = target.addEventListener ? type : 'on' + type;

  target[listenerFunction](eventName, callback);
},

关于javascript - addEventListener 未附加到正确的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36390833/

相关文章:

javascript - 如何设置引导多选最小选择和最大选择值

javascript - 按循环内的条件更改 append 的 td

javascript - iPhone 的 safari 上的视频标签不会触发触摸事件

javascript - 如何确定字符串是否是有效的 html4 tagName?

javascript - 如何使用 javascript 在用户控制页面中获取父页面名称

javascript - 可以将 URL 参数传递给 Javascript 文件吗?

javascript - React 中的 TextField 内无法识别新行 '\n'

PHP HTML DOM : How to select all visible/readable text?

javascript - 如何创建动态 html 表单的创建 JSON 对象(表单元素)?

javascript - 幕后发生了什么,这是正确的方法吗? (通过 Javascript 修改 DOM)