Javascript 停止单击事件传播
我试图在用户单击某个网页时突出显示该网页的任何DOM元素。为此,我遍历当前元素的所有元素,并禁用任何功能(例如,我可以单击而不被重定向):Javascript 停止单击事件传播,javascript,dom,Javascript,Dom,我试图在用户单击某个网页时突出显示该网页的任何DOM元素。为此,我遍历当前元素的所有元素,并禁用任何功能(例如,我可以单击而不被重定向): var elems=window.document.getElementsByTagName('*'); 对于(变量i=0;i
var elems=window.document.getElementsByTagName('*');
对于(变量i=0;i
问题是,当用户单击时,会触发很多单击事件,因为每个元素都有tas行为,我需要避免取消高亮显示
你知道如何改进这一点或其他方法吗?
非常感谢
p/d:它必须是纯JS您需要做两件事:首先,您希望实际添加一个
事件,而不是重新定义其单击行为,其次,您希望它不会在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();
});
}
var elems=window.document.getElementsByTagName('*');
对于(变量i=0;i
以下是更多内容:
添加事件侦听器:
停止立即传播:
正如一位勇敢的编辑所说,您还可以将false
作为第三个参数传递给addEventListener
,它基本上做了相同的事情,但不易理解,还做了一些额外的事情,所以我选择不默认它,因为这样更容易理解您正在停止传播。e一个执行此操作的JSFIDLE:
var elems=window.document.getElementsByTagName('*');
对于(变量i=0;i
上面有什么解释
另外,您不应该在循环中绑定onclick,因为它会导致错误;最好调用函数并传递正确的参数。谢谢!我不知道stopImmediatePropagation!我使用onclick故意覆盖所有元素行为,如果不是,例如,在突出显示之前,我只需单击并退出即可page@gal007e.preventDefault()
已经取消了任何其他元素行为,我认为默认的onclick
函数速度更快,因为它是用本机代码编写的,覆盖它会用较慢的JS替换它。它会起作用,但这确实是更好的做法。
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();
});
}
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';
};
}