Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jquery中防止从父元素到子元素的事件_Javascript_Jquery - Fatal编程技术网

Javascript 在jquery中防止从父元素到子元素的事件

Javascript 在jquery中防止从父元素到子元素的事件,javascript,jquery,Javascript,Jquery,我已将事件绑定如下: $(document).delegate('.budget', 'click', function(e){ if ($(this).hasClass('collapsed')) { $(this).removeClass('collapsed'); $(this).addClass('expanded'); } else if ($(this).hasClass('expan

我已将事件绑定如下:

    $(document).delegate('.budget', 'click', function(e){
        if ($(this).hasClass('collapsed')) {
           $(this).removeClass('collapsed');
           $(this).addClass('expanded');
        }
        else if ($(this).hasClass('expanded')) {
           $(this).removeClass('expanded');
           $(this).addClass('collapsed');
        }
    });  
    $('[id^="tree"]').delegate('.collapsed', 'click', function(e){
        var elementId = $(this).attr('id');
        hideChildElement(elementId);
    });
基本上,这会在展开和折叠之间切换

我有另一个活动绑定如下:

    $(document).delegate('.budget', 'click', function(e){
        if ($(this).hasClass('collapsed')) {
           $(this).removeClass('collapsed');
           $(this).addClass('expanded');
        }
        else if ($(this).hasClass('expanded')) {
           $(this).removeClass('expanded');
           $(this).addClass('collapsed');
        }
    });  
    $('[id^="tree"]').delegate('.collapsed', 'click', function(e){
        var elementId = $(this).attr('id');
        hideChildElement(elementId);
    });
由第二个事件绑定的元素是由第一个事件绑定的元素的父元素。 发生的情况是,单击第一个绑定事件方法中的元素也会触发由第二个事件绑定绑定的事件。 我想阻止从第二个事件绑定到第一个事件绑定方法的任何事件绑定

如果元素A绑定到第一个事件绑定的click事件,而B绑定到第二个事件绑定,A在B内部,或者A是B的子元素,我不希望B的任何事件传播到A。
注:我尝试了e.停止即时复制;但是不起作用

我认为您希望防止在单击.budged元素时触发绑定到[id^=tree]的事件处理程序。在这种情况下,您可以测试单击事件的来源:

$('[id^="tree"]').delegate('.collapsed', 'click', function(e){
    if($(e.target).closest('.budget').length === 0) {
        // not from inside budget element
        var elementId = $(this).attr('id');
        hideChildElement(elementId);
    }
});
或者,如果将两个事件处理程序绑定到同一个元素,即都绑定到document或[id^=tree]或两者之间的任何元素,event.stopImmediatePropagation将正常工作


如果这不是您想要的,请澄清您的问题,这不容易理解。

我认为您希望防止在单击.budged元素时触发绑定到[id^=tree]的事件处理程序。在这种情况下,您可以测试单击事件的来源:

$('[id^="tree"]').delegate('.collapsed', 'click', function(e){
    if($(e.target).closest('.budget').length === 0) {
        // not from inside budget element
        var elementId = $(this).attr('id');
        hideChildElement(elementId);
    }
});
或者,如果将两个事件处理程序绑定到同一个元素,即都绑定到document或[id^=tree]或两者之间的任何元素,event.stopImmediatePropagation将正常工作


如果这不是您想要的,请澄清您的问题,这不容易理解。

作为旁注,您可以使用$this简化切换。toggleClassexpanded.sonam抱歉,我无法获得B中的逻辑a,B中的逻辑a。但是:您要找的不是选择器a是B的孩子,例如:@FelixKling即使有授权-@Zoltan:它仍然没有复制这种情况。父元素的事件处理程序必须绑定到更靠近它们的元素,而不是根元素。示例:。当然,如果OP只是更改此项并将两个处理程序绑定到文档,stopImmediatePropagation就可以工作。作为补充说明,您可以使用$this.toggleClassexpanded.sonam抱歉,我无法获得B中的逻辑a,B中的逻辑B。但是:您要找的不是选择器a是B的孩子,例如:@FelixKling即使有授权-@Zoltan:它仍然没有复制这种情况。父元素的事件处理程序必须绑定到更靠近它们的元素,而不是根元素。示例:。当然,如果OP只是更改此项并将两个处理程序绑定到文档,stopImmediatePropagation就可以工作。是的,我想防止事件传播到第一个事件绑定,那么这应该可以工作。如果没有,你必须提供更多的信息,尤其是你的标记。非常感谢你,我花了一整天的时间试图解决这个问题。您设定了我的日期是的,我希望阻止事件传播到第一个事件绑定,然后这应该可以工作。如果没有,你必须提供更多的信息,尤其是你的标记。非常感谢你,我花了一整天的时间试图解决这个问题。你让我开心