javascript - 单击事件绑定(bind)的奇怪行为;事件未触发

标签 javascript html debugging

所以我遇到了这个奇怪的问题,我不知道我是否公然遗漏了一些东西。访问this页面(或任何媒体文章)。打开控制台并注入(inject)以下JS代码。

for (const elem of document.querySelectorAll('.progressiveMedia-image.js-progressiveMedia-image')) {
    elem.addEventListener('click', function () { 
        console.log(event.target);
    });
} 

现在单击大图像,预期的行为应该是(请纠正我,因为我似乎是错的),当您第一次和第二次单击目标元素时,都会打印目标元素。但事实证明,当您第二次单击图像(缩放)(缩小)时,它不会在控制台中打印目标。

我认为可能存在一些覆盖元素,因此我将事件绑定(bind)在 body 上,以使用以下注入(inject)的 JS 捕获所有事件。

document.body.addEventListener('click', function () {
    console.log(event.target);
}, true);

但即便如此,我也只能得到目标的一份控制台打印结果。

使用 body 的委托(delegate)不起作用的一种理论可能如下 - 新创建的元素在创建时不会位于 body 中,稍后它将被移动到 DOM 树中的位置。因此,委托(delegate)在通过 body 找到它时无法找到它,但能够通过 document 捕获它。

经过更多探索并注入(inject)以下 JS(取自 here 并且我知道可以添加断点,我之前确实这样做过,但没有结果,所以才采取这种做法。)

var observer = new MutationObserver(function (mutationsList, observer) {
  for (var mutation of mutationsList) {
    if (mutation.type == 'childList') {
      console.log('A child node has been added or removed.');
    }
    else if (mutation.type == 'attributes') {
      console.log('The ' + mutation.attributeName + ' attribute was modified.');
    }
  }
});
observer.observe(document, {
  attributes: true,
  childList: true,
  subtree: true
});

我没有看到任何元素在点击时添加到 DOM(它是在加载时添加的),因此理论可能不正确。所以我想现在真正的问题是为什么通过 document 进行事件捕获能够找到点击事件,而不是从 body 中找到。我认为委托(delegate)在初始 DOM 结构上不起作用,因为它会破坏目的。

此外,如果重复,请告诉我,因为我真的不知道到底要搜索什么。

最佳答案

可能是因为缩放图像前面有东西拦截了捕获模式下的点击事件并停止传播。

我已经成功了

document.addEventListener("click", function(e){ console.log(e.target); }, true);

关于javascript - 单击事件绑定(bind)的奇怪行为;事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322430/

相关文章:

html - 嵌套的 flex-box 包装问题

java - 康威的生命游戏调试 (Java)

javascript - 如何从 chartjs 中隐藏零数据值?

javascript - $().load() 而不是加载整个页面,但需要在所有页面上保留菜单

javascript - 我们可以在 AngularJS 中深度克隆事件对象吗?

c++ - 您可以使用断言来测试 C++ 中的类型定义吗?

debugging - 如何在附加 gdb 的情况下运行 R 脚本?

javascript - 绑定(bind)子输入:value to the parent prop

jquery - Ajax 请求不打印 html 响应

javascript - 如何在不删除背景的情况下在 Canvas 上删除