【问题标题】:How to catch any click event in jquery [duplicate]如何在jquery中捕获任何点击事件[重复]
【发布时间】:2013-03-05 21:52:40
【问题描述】:

我有一个按钮,当它被点击时,如果我再次点击它会显示一个带有图像的 div(就像聊天的表情面板),但我想要做的是: 如果 div 已经显示,然后我单击页面的任何其他内容,我想隐藏它。我试过这个:

$("myBtn").click(function(){
    // show div
});

$(document).click(function(){
// hide div
});

单击“myBtn”时,div 会自动显示和隐藏。我该如何解决?

感谢您的宝贵时间。

【问题讨论】:

  • 我尝试像这样捕获点击事件:$("div").click(function(){//} 但它为网页中的每个 div 元素执行内部代码。所以它显示并隐藏 div

标签: javascript jquery


【解决方案1】:

您可以尝试以下方法:

$(document).on('click', function(evt) {
    if(!$(evt.target).is('#my-id')) {
        //Hide
    }
});

更新

只是为了让您拥有完整的工作集:

$('#mybutton').on('click', function(evt) {
    $('#mydiv').show();
    return false;//Returning false prevents the event from continuing up the chain
});

【讨论】:

  • @chad 和 @Mathletics 谢谢。 .on 应该用于所有事件。 :)
  • 出于好奇, .on('click', ...) 和 .click(...) 有什么区别?一个比另一个更受欢迎吗?
  • @CharlieKilian click 一直是bind("click") 的糖; on 消除了所有这些,并包含.on(event, childSelector, callback) 的新简单委托语法
  • +1 到@Mathletics 以获得该解释。欲了解更多信息,这里是 jQuery 网站的链接:api.jquery.com/on
  • 有用的解释。 Return false 让我很开心......谢谢。
【解决方案2】:

在显示原始<div> 的同时,将新的<div> 添加到具有如下样式/css 设置的页面:

.ui-widget-overlay {
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    z-index: 100;
}

确保原始的<div>——您希望能够在不关闭它的情况下单击它的那个——具有更高的z-index,但页面上的所有其他内容的 z-index 都较低。

当您将新 div 添加到您的页面时,给它.ui-widget-overlay 类,并添加一个点击处理程序来拦截对该<div> 的点击。使用点击处理程序添加覆盖 div 如下所示:

$('<div class="ui-widget-overlay">')
    .click(function() {
        $('.ui-widget-overlay').remove();
        $('selector-for-original-div').hide();
    })
    .appendTo('body');

这一切的结果是:你有两个 div。第一个是您要显示的内容并允许用户在不关闭它的情况下单击它,第二个是第一个下方的不可见 div 占据整个浏览器窗口,因此如果用户单击除上部 div 之外的任何位置,它会拦截单击事件.在该点击事件中,您移除隐藏的 div 并隐藏原始 div。

【讨论】:

  • 是的,这是一个常见的实现,但它与实际问题非常相干。
  • 这个方法也行,但是说到效率,上面的答案是最好的。感谢您的帮助。
【解决方案3】:
<script type="text/javascript">
  $('body').click(function() {
   if($("div").is(':visible')){
    $("div").hide();
   }
  });
</script>

这里的 $("div") 选择器应该是您的 div,它要么具有 id 要么具有类例如:如果 &lt;div class="class" id="id"&gt;$("div") 将更改为 $("div.class")$("div#id")

【讨论】:

  • 您可能希望在选择器中比"div" 更具体,尤其是作为 OP 可能明确使用的通用示例。
  • 感谢@Mathletics 我添加了解释。
  • 永远不要使用$('div#id'),因为这会过度指定,实际上会使Sizzle 无法使用getElementById() 优化。
【解决方案4】:

更新

假设您在元素显示时有一个“活动”类,它将是:

$('html').click(function(e){

  if(!$(e.target).attr("id") == "my-id") { 

  }

});

【讨论】:

  • 关闭,但在不需要的时候真的很丑。
  • @Chad,感谢您的评论。你会怎么做?我很乐意改进我的代码。
  • 您清理了大部分内容,但您绑定到'html',这不是“错误”,但约定是绑定到document
  • 谢谢,在这种情况下我学到了 'on' 和 'document' 的使用两件事。将修复我的代码。干杯。 B.
【解决方案5】:
<div class="slControlWrapper">
    <div class="slControlLabel">
        <asp:Label ID="lblSL" CssClass="lblSL" runat="server">Clickable Label</asp:Label>
    </div>
    <div class="slControlSeparator">

    </div>
    <div class="slControlDropDown">

    </div>
     <div id="wndSL">
        This is the hidden content of my DIV Window
    </div>
    <div id="test">
    I am for test click on me
    </div>
</div>


 $('.slControlLabel, .slControlDropDown').bind('click',function(event){

   $('#wndSL').show(); 
 event.stopPropagation();
 });


$('html').click(function() {
   $('#wndSL').hide(); 
});


    #wndSL {

display:none;     background-color: blue;    height:500px;    width:590px;
}

在这里看看:

http://jsfiddle.net/nCZmz/26/

【讨论】:

  • 对我有用,只需单击此处,先生。
  • 我知道wnd 是匈牙利语的Window,但sl 是什么?
  • 为什么你的解决方案中有 ASP 控制标签?
  • -1 丑,点击显示的div还是隐藏,这是错误的。
  • 也许sl 的意思是“服务器标签”?我还是不懂语义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多