将事件监听器添加到除选定的几个对象之外的所有对象?

ein*_*ein 6 javascript event-handling javascript-events

我正在尝试向所有对象添加事件监听器,除了一些选定的(所选的也有任意级别的任意子元素)?

我之前问过这个问题,但我没有得到答案.我已接近解决它.你可以帮我调试一下吗?

我正在向被调用的body元素添加一个事件监听器,bodylistener并为所调用的几个元素添加一个事件监听器selectedElementsMarkTrue.我不想执行一些代码的几个选择的元素,听众selectedElementsMarkTrue进行pior到bodylistenersetTimeout function.selectedElementsMarkTrue设置变量selectedElementstruebodylistener检查是否selectedElementstrue之前执行索姆代码.我的代码还有问题

    var selectedElements = false;
    var bodylistener = function(){
        window.setTimeout(function(){//Setting timeout so that the other handler, selectedElementsMarkTrue, always performs first
            (function(){
                if(selectedElements == false){
                    //Do some stuff
                }else{
                    selectedElements = false;
                }
            });
        }, 10);//Could be 0, but te be sure I set 10
    };
    var selectedElementsMarkTrue = function(){
        selectedElements = true;
    };
    $('#dontAddEventListener1, #dontAddEventListener2').each(function(){
        this.addEventListener('click', selectedElementsMarkTrue, false);
    });
    document.body.addEventListener('click', bodylistener, false);
Run Code Online (Sandbox Code Playgroud)

我无法获取setTimeout函数来执行底层代码?

Sha*_*531 5

听起来你想要这样的行为:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script>
            window.addEventListener("DOMContentLoaded", function() {
                document.body.addEventListener("click", function(e) {
                    var el = e.target;
                    do {
                        if (el.hasAttribute && el.hasAttribute("data-nofire")) {
                            return;
                        }
                    } while (el = el.parentNode);
                    alert('do stuff');
                }, true);
            }, false);
        </script>
    </head>
    <body>
        <p><span>click me</span></p>
        <p data-nofire><span>click me</span></p>
        <p data-nofire>click me</p>
        <p>click me</p>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

或者,你可以像纳伦建议的那样做:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script>
            window.addEventListener("DOMContentLoaded", function() {
                var nofire = document.getElementsByClassName("nofire");
                for (var i = 0; i < nofire.length; ++i) {
                    nofire[i].addEventListener("click", function(e) {
                        e.stopPropagation();
                    }, true);
                }
                document.body.addEventListener("click", function(e) {
                    alert('do stuff');
                }, false);
            }, false);
        </script>
    </head>
    <body>
        <p><span>click me</span></p>
        <p class="nofire"><span>click me</span></p>
        <p class="nofire">click me</p>
        <p>click me</p>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)