【问题标题】:jQuery: Close DIV by clicking anywhere apart from the DIV itself?jQuery:通过单击除 DIV 本身之外的任何位置来关闭 DIV?
【发布时间】:2011-07-07 11:41:50
【问题描述】:

我有一个 div 在单击按钮时会向下滑动,我想在用户时向上滑动 div:

  1. 在 DIV 本身之外的任何地方点击
  2. 单击 div 中的关闭按钮。

目前我已经到了这样一个阶段,您单击类为 .panel-tab 的元素 - 它会在 ID 为 #panel 的面板上向下滑动...单击它向上滑动的任何其他位置....

到目前为止,这是我打开和关闭 DIV 的代码:

<script type="text/javascript">
$(document).ready(function(){

$('.panel-tab').click(function(e) {
  $("#panel").stop(true, true).slideToggle("slow");
  e.stopPropagation();
});

$("body").click(function () {
  $("#panel:visible").stop(true, true).slideUp("slow");
});});
</script>

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您可以将click 事件绑定到document 并检查点击事件是否发生在该div 或任何子级中。如果没有,请关闭它。

    插件时间!

    (function($){
        $.fn.outside = function(ename, cb){
            return this.each(function(){
                var $this = $(this),
                    self = this;
    
                $(document).bind(ename, function tempo(e){
                    if(e.target !== self && !$.contains(self, e.target)){
                        cb.apply(self, [e]);
                        if(!self.parentNode) $(document.body).unbind(ename, tempo);
                    }
                });
            });
        };
    }(jQuery));
    

    用法

    $('.panel-tab').outside('click', function() {
        $('#panel').stop(true, true).slideUp('slow');
    });
    

    【讨论】:

    • 感谢您的回复,抱歉,使用您提供的两个部分的最终示例是什么?
    • @CodeyMonkey:好吧,您只需将“第一部分”拉入.js file,将其包含在您的网站上并像我在“第二部分”中一样使用它。顺便说一句,这适用于所有类型的事件。
    • @jAndy:你为什么不简单地总是触发事件并停止应该保持打开的元素上的传播?
    • @meo:几个原因。我想这样做是最方便和易于使用和重复使用的。但在大多数情况下,您还必须检查目标下方的任何后代节点。
    • 感谢这确实有效!感谢您抽出宝贵的时间。
    【解决方案2】:

    编辑 How to create a custom modal popup - and how to close it clicking outside of it


    这里只是我的一个例子:http://jsbin.com/uqiver/1/edit

    $("body").on('click', function(ev) {
        var myID = ev.target.id;
        if (myID !== 'panel') {
            $('#panel').hide();
        }
    });
    

    或者您也可以先检查它是否可见:

    var $pan = $('#panel');
    
    $("body").on('click', function(ev) {
        if ($pan.is(':visible') && ev.target.id !== 'panel') $pan.hide();
    });
    

    【讨论】:

      【解决方案3】:

      我会做这样的事情

      var $doc, $panel = $('.panel-tab');
      $doc = $(document);
      $doc.bind("click", function(){
         $panel.hide();
         $doc.undbind("click");
      });
      
      $panel.bind("click", function(e){
         e.stopPropagation();
      });
      

      您总是在单击文档时关闭选项卡,但您会阻止事件在其自身的选项卡上传播。

      这里是一个工作示例: http://jsfiddle.net/meo/TnG4E/

      【讨论】:

      • @roXon:这主要是因为我在 UNDBIND 中的拼写错误(说德语是个问题;))。这只是一个例子。我知道它不会在每一种情况下都有效:) 但如果认为它会为他的例子起到作用。
      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 2016-11-20
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多