2

我有如下绑定事件:

    $(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 绑定到来自第一个事件绑定的单击事件,并且 B 绑定到第二个事件绑定(A 在 B 内部或 A 是 B 的子级),我不希望 B 的任何事件传播到 A。注意我试过e.stopImmediatePropagation();但没有没用

4

1 回答 1

0

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

$('[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()将可以正常工作。

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

于 2012-09-01T15:46:32.040 回答