jQuery + stopPropagation:从父选择器中排除子元素

Han*_*com 1 jquery click parent-child

基于接受的答案的最终工作代码

        $('#photo-upload, #photo-upload .close').click(function(){
            $('#photo-upload').removeClass('show');
        });

        $('#upload-button').click(function(){
            $('#photo-upload').addClass('show');
        });

        $('#form-window').click(function(e){
              e.stopPropagation();
        });
Run Code Online (Sandbox Code Playgroud)

原始问题

我有一个带关闭按钮的模式窗口。该窗口由链接触发a#upload-button#photo-upload是一个 100% 高度 + 宽度的固定 div。#form-window是一个 200 像素 x 200 像素的框,在其内部水平和垂直居中#photo-upload

<div id="photo-upload">
    <div id="form-window">
        <!-- Content -->
        <a class="close"></a>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

关闭按钮的位置绝对位于右上角。我想设置一个点击功能,以便在模态窗口外点击关闭窗口,并且点击关闭按钮关闭窗口。但是这样点击窗口本身不会关闭窗口。

我目前的代码是:

$('#photo-upload').click(function(e){
    if(!$(e.target).is('#form-window')){
      return false;
    } else {
        $(this).removeClass('show');
    }
});

$('#form-window').live("click",function(e){
    if(!$(e.target).is('a.close')){
      e.stopPropagation();
    }
});


$('#upload-button').live("click", function(){
    $('#photo-upload').addClass('show');
});

$('#photo-upload .close').live("click", function(){
    $('#photo-upload').removeClass('show');
});
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,当我单击这些元素中的任何一个时没有任何反应,并且无法关闭 div。我究竟做错了什么?

如何在父元素上使用 stopPropagation() 但排除子元素(在我的情况下,a.close)。

Sha*_*oli 5

检查target不是form-window click处理程序内的关闭链接。它不会停止event propagation其他让文档click处理程序负责休息。尝试这个

    $(document).live('click',function(){
        $('#form-window').removeClass('show');
    });

    $('#form-window').live("click",function(e){
        if(!$(e.target).is('a.close')){
          e.stopPropagation();
        }
    });
Run Code Online (Sandbox Code Playgroud)