Javascript 是否将事件侦听器添加到除少数选定对象之外的所有对象?

Javascript 是否将事件侦听器添加到除少数选定对象之外的所有对象?,javascript,javascript-events,event-handling,Javascript,Javascript Events,Event Handling,我正在尝试将事件侦听器添加到除少数选定对象之外的所有对象(选定对象在任意级别中也具有任意子元素) 我以前问过这个问题,但我没有真正得到答案。我差一点就解决了。你能帮我调试一下吗 我将向名为bodylistener的body元素添加一个事件侦听器,并向名为selectedElementsMarkTrue的少数选定元素添加一个事件侦听器。对于我不想执行某些代码的少数选定元素,侦听器selectedElementsMarkTrue使用setTimeout函数执行pior tobodylisteners

我正在尝试将事件侦听器添加到除少数选定对象之外的所有对象(选定对象在任意级别中也具有任意子元素)

我以前问过这个问题,但我没有真正得到答案。我差一点就解决了。你能帮我调试一下吗

我将向名为
bodylistener
的body元素添加一个事件侦听器,并向名为
selectedElementsMarkTrue
的少数选定元素添加一个事件侦听器。对于我不想执行某些代码的少数选定元素,侦听器
selectedElementsMarkTrue
使用
setTimeout函数执行pior to
bodylistener
selectedElementsMarkTrue
将变量
selectedElements
设置为
true
并在执行som代码之前检查
selectedElements
是否为
true
。我的代码仍然有问题

    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);

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

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

<!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>

addEventListener(“DOMContentLoaded”,function()){
document.body.addEventListener(“单击”,函数(e){
var el=e.target;
做{
if(el.hasAttribute&&el.hasAttribute(“数据nofire”)){
返回;
}
}while(el=el.parentNode);
警惕(“做事”);
},对);
},假);
点击我

单击我

单击我

点击我

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

<!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>

addEventListener(“DOMContentLoaded”,function()){
var nofire=document.getElementsByClassName(“nofire”);
对于(变量i=0;i

单击我

单击我

点击我


通过处理元素单击事件来防止事件传播

$('#dontAddEventListener1, #dontAddEventListener2').click( function(event){ event.preventDefault(); return false; });

我将标记我的另一个问题,这与解决此问题后的此问题类似。请投票表决此问题。如果您认为了解这一点很重要,则可以停止不希望触发父级单击事件的事件传播。$(“#dontAddEventListener1,#dontAddEventListener2”)。单击(函数(事件){event.preventDefault();return false;});我从来没有理解过
capture
,我是说
addEventListener
中的第三个参数,你能给我解释一下吗?我忘了elements-do.not-fire也有子elementsok它起作用了。但我没有使用window.addEventListener包装器。但是如何删除body元素中的事件侦听器?@Woho87,可能会有所帮助?