0

在父 div 的Click事件中,我返回一个关闭我的覆盖 div 的函数,如下所示

$('div#overlayBackground').click(function() {
            return clicker();
        });

这个 div 的子元素是使用填充的,.innnerHTML并且document.ready()我给子元素单击功能,如下所示:

$('#CaptionTextArea').live('click', function(e) {
             e.stopPropagation();
        });

这样点击TextArea不会关闭覆盖。但是子元素click永远不会运行,而父 divclick总是运行,感谢任何帮助。

4

2 回答 2

2

.live()在 jQuery 库中已弃用,因此您不应该使用它。原因之一是事件必须一直传播到要处理的根级别,所以stopPropagation在那里没有用。更好的解决方案是在同一个父点击处理程序中处理这种情况:

$('div#overlayBackground').click( function(e) {
    if( e.target.id != 'CaptionTextArea' )
        return clicker();
});

由于#CaptionTextArea(a <textarea>) 不会有任何子项用于传播单击事件,因此效果很好;不过,一般来说,您还希望处理来自其后代的事件:

// ignore clicks which originated within #CaptionTextArea
if( $(e.target).closest('#CaptionTextArea').length === 0 )
于 2012-09-03T01:43:27.203 回答
2

.live()方法在文档级别绑定事件处理程序。当事件冒泡到文档时,jQuery 然后检查它是否发生在您指定的元素上。因此,如果您有其他事件处理程序绑定到更靠近发生事件的元素并且这些处理程序停止事件传播,.live则永远不会调用基于 - 的处理程序。如果您的clicker()函数返回false,那将停止传播。

你可以试试这个:

$('div#overlayBackground').on("click", "#CaptionTextArea", function(e) {
    e.stopImmediatePropagation();
}).on("click", function(e) {
    return clicker();
});

也就是说,使用该.on()方法替换您的.live(),以便事件处理程序实际上与您的其他单击事件绑定到相同的父元素。jQuery 按照它们绑定的顺序调用事件处理程序,因此.live()将首先调用此替换,您可以使用它event.stopImmediatePropagation()来阻止第二个运行。

于 2012-09-03T01:37:04.143 回答