【问题标题】:e.preventDefault() not working in 100% casese.preventDefault() 在 100% 的情况下不起作用
【发布时间】:2020-11-19 17:04:11
【问题描述】:

我正在尝试禁用网页上的每个点击事件。

只需将此代码复制/粘贴到您的控制台中即可:

document.addEventListener("click", function (e) {
    e.preventDefault();
    e.stopImmediatePropagation();
    let clicked = e.target;
    console.log(clicked);
  });

这应该可以防止每次点击事件吧?但我仍然发现它被忽略的情况(主要是链接)。我错过了什么?

【问题讨论】:

  • 您可以尝试在末尾添加true}, true);,以便在捕获阶段而不是冒泡阶段调用处理程序
  • 这会“停止”一直冒泡到文档根元素的点击事件。这不会阻止事件处理程序或元素以这种方式对“点击”做出反应
  • 不,它只会阻止document 上的点击事件做任何事情。该事件将在它冒出这么高之前完成正常的事情。
  • @blex 看起来可行!谢谢大佬
  • @ozgur 我相信这里使用的e.stopImmediatePropagation() 应该足够了,基于一些测试和on this“除了阻止元素上的任何其他处理程序被执行外,此方法还通过隐式调用 event.stopPropagation() 来停止冒泡”

标签: javascript addeventlistener preventdefault


【解决方案1】:

这里的问题是事件在哪个阶段被您的处理程序captured(或拦截)。您问题中的代码正在针对在传播的最后阶段冒泡到document(其传播尚未被文档树下方的元素停止的事件)执行,不是所有发生在document上的事件(你所追求的)。

在您的情况下,您实际上希望为所有 descendants during the "capture" phase 停止事件的执行 - 请参阅第 3.1 节 -(事件传播的第一阶段)。

true添加到捕获阶段执行的调用中:

document.addEventListener("click", function (e) {
 // ...
}, true);

您的处理程序中也应该只需要e.stopImmediatePropagation()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    相关资源
    最近更新 更多