停止点击事件传播
Stop click event propagation
我试图在用户单击某个网页时突出显示某个网页的任何 DOM 元素。为此,我遍历当前元素的所有元素并禁用任何功能(例如,我可以单击而不被重定向):
var elems = window.document.getElementsByTagName('*');
for (var i = 0; i < elems.length; i++) {
elems[i].onclick = function(e){
e.preventDefault();
}
问题是,当用户点击时,会触发很多点击事件,因为每个元素都有 tas 行为,我需要避免取消突出显示。
知道如何改进它或任何替代方案吗?
非常感谢!
P/d: 必须是纯JS
你需要做两件事:首先,你要实际添加一个 event
,而不是重新定义它的点击行为,其次,你不希望它 bubble
起来通过dom。试试这个:
var elems = window.document.getElementsByTagName('*');
for (var i = 0; i < elems.length; i++) {
// Use addEventListener to listen for events.
// Older version of IE use attachEvent, but I guess thats irrelevant.
elems[i].addEventListener("click", function(e){
e.preventDefault();
// Use stopImmediatePropagation to stop the element from passing this click to wrapping parents - because a click on a child is technically a click on the parent as well.
e.stopImmediatePropagation();
});
}
阅读更多内容:
Add Event Listener: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
Stop Immediate Propagation: https://developer.mozilla.org/en-US/docs/Web/API/Event/stopImmediatePropagation
正如一位勇敢的编辑所说,您还可以将 false
作为第三个参数传递给 addEventListener
,它的作用基本相同,但不太容易理解,并且还会做一些额外的事情,所以我选择不默认此设置,因为它更容易理解您正在停止传播。
我制作了一个 jsfiddle:
https://jsfiddle.net/zgqpnaey/
var elems = window.document.getElementsByTagName('*');
for (var i = 0; i < elems.length; i++) {
myFunction(elems[i]);
}
function myFunction(element) {
element.onclick = function(e) {
e.preventDefault();
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
element.style.background = 'red';
};
}
上面有解释。
此外,您不应在循环内绑定 onclick,这会导致错误;最好调用一个函数并传递适当的参数。
我试图在用户单击某个网页时突出显示某个网页的任何 DOM 元素。为此,我遍历当前元素的所有元素并禁用任何功能(例如,我可以单击而不被重定向):
var elems = window.document.getElementsByTagName('*');
for (var i = 0; i < elems.length; i++) {
elems[i].onclick = function(e){
e.preventDefault();
}
问题是,当用户点击时,会触发很多点击事件,因为每个元素都有 tas 行为,我需要避免取消突出显示。
知道如何改进它或任何替代方案吗? 非常感谢!
P/d: 必须是纯JS
你需要做两件事:首先,你要实际添加一个 event
,而不是重新定义它的点击行为,其次,你不希望它 bubble
起来通过dom。试试这个:
var elems = window.document.getElementsByTagName('*');
for (var i = 0; i < elems.length; i++) {
// Use addEventListener to listen for events.
// Older version of IE use attachEvent, but I guess thats irrelevant.
elems[i].addEventListener("click", function(e){
e.preventDefault();
// Use stopImmediatePropagation to stop the element from passing this click to wrapping parents - because a click on a child is technically a click on the parent as well.
e.stopImmediatePropagation();
});
}
阅读更多内容:
Add Event Listener: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
Stop Immediate Propagation: https://developer.mozilla.org/en-US/docs/Web/API/Event/stopImmediatePropagation
正如一位勇敢的编辑所说,您还可以将 false
作为第三个参数传递给 addEventListener
,它的作用基本相同,但不太容易理解,并且还会做一些额外的事情,所以我选择不默认此设置,因为它更容易理解您正在停止传播。
我制作了一个 jsfiddle:
https://jsfiddle.net/zgqpnaey/
var elems = window.document.getElementsByTagName('*');
for (var i = 0; i < elems.length; i++) {
myFunction(elems[i]);
}
function myFunction(element) {
element.onclick = function(e) {
e.preventDefault();
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
element.style.background = 'red';
};
}
上面有解释。
此外,您不应在循环内绑定 onclick,这会导致错误;最好调用一个函数并传递适当的参数。