停止从单击处理程序传播mousedown / mouseup

时间:2012-01-16 01:59:08

标签: javascript jquery mouseevent

Here's a DEMO

我有两个divs,一个内部和外部:

<div id="outer">
    <div id="inner"></div>
</div>

使用一些CSS,你可以看到哪个是:

#outer {
    width: 250px;
    height: 250px;
    padding: 50px;
    background: yellow;
}

#inner {
    width: 250px;
    height: 250px;
    background: blue;
}

我尝试停止在mousedown处理程序中传播mouseupclick个事件,如下所示:

$('#inner').on('click', function(e) {
    e.stopPropagation();
    $(this).css({'background': 'green'});
    return false;
});

$('#outer').on('mousedown', function(e) {
    $(this).css({'background': 'green'});
});

$('#outer').on('mouseup', function(e) {
    $(this).css({'background': 'yellow'});
});

这似乎不可能。如上所示another DEMO)

,其他.stopPropagationmousedown来电中的mouseup来电是什么工作?
$('#inner').on('mousedown', function(e) {
    e.stopPropagation();
    return false;
});

$('#inner').on('mouseup', function(e) {
    e.stopPropagation();
    return false;
});

我可能已经回答了我自己的问题,但我不确定我的方法是最好的还是最合理的。这是阻止事件冒泡到mousedownmouseup的正确方法吗?

1 个答案:

答案 0 :(得分:16)

是。由于mouseclick和mousedown / mouseup是不同的事件,你根本无法从另一个事件中获取 - 你必须在你自己的mousedown / mouseup处理程序中完成它。您可以做的是将其重构为在两个地方使用的通用方法:

stopPropagation('#inner', 'mousedown');
stopPropagation('#inner', 'mouseup');

function stopPropagation(id, event) {
    $(id).on(event, function(e) {
        e.stopPropagation();
        return false;
    });
}