e.preventDefault() 在 100% 的情况下不起作用
e.preventDefault() not working in 100% cases
我正在尝试禁用网页上的所有点击事件。
document.addEventListener("click", function (e) {
e.preventDefault();
e.stopImmediatePropagation();
let clicked = e.target;
console.log(clicked);
});
这应该可以防止每次点击事件吧?但我仍然发现它被忽略的情况 (主要是链接).
我错过了什么?
这里的问题是事件在哪个阶段被您的处理程序captured(或拦截)。您问题中的代码正在针对在最后阶段 冒泡到 document
的事件(其传播未被文档树下方的元素停止的事件)执行传播,不是 document
发生的所有事件(你想要的)。
在您的情况下,您实际上想要停止所有事件的执行 descendants during the "capture" phase - 查看第 3.1 节 -(事件传播的第一阶段)。
将true
添加到捕获阶段执行的调用:
document.addEventListener("click", function (e) {
// ...
}, true);
您的处理程序中也应该只需要 e.stopImmediatePropagation()
。
我正在尝试禁用网页上的所有点击事件。
document.addEventListener("click", function (e) {
e.preventDefault();
e.stopImmediatePropagation();
let clicked = e.target;
console.log(clicked);
});
这应该可以防止每次点击事件吧?但我仍然发现它被忽略的情况 (主要是链接).
我错过了什么?
这里的问题是事件在哪个阶段被您的处理程序captured(或拦截)。您问题中的代码正在针对在最后阶段 冒泡到 document
的事件(其传播未被文档树下方的元素停止的事件)执行传播,不是 document
发生的所有事件(你想要的)。
在您的情况下,您实际上想要停止所有事件的执行 descendants during the "capture" phase - 查看第 3.1 节 -(事件传播的第一阶段)。
将true
添加到捕获阶段执行的调用:
document.addEventListener("click", function (e) {
// ...
}, true);
您的处理程序中也应该只需要 e.stopImmediatePropagation()
。