Javascript 停止单击事件传播

Javascript 停止单击事件传播,javascript,dom,Javascript,Dom,我试图在用户单击某个网页时突出显示该网页的任何DOM元素。为此,我遍历当前元素的所有元素,并禁用任何功能(例如,我可以单击而不被重定向): var elems=window.document.getElementsByTagName('*'); 对于(变量i=0;i

我试图在用户单击某个网页时突出显示该网页的任何DOM元素。为此,我遍历当前元素的所有元素,并禁用任何功能(例如,我可以单击而不被重定向):

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@gal007
e.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';
    };    
}