【问题标题】:Hide div when user clicks outside unless closing lightbox当用户点击外部时隐藏 div 除非关闭灯箱
【发布时间】:2014-03-21 22:14:42
【问题描述】:

我目前正在使用以下代码来允许用户在点击时显示/隐藏 div。 单击 div 外的任意位置时,会关闭 div。

但是,在 div 中有一个可以打开灯箱的链接。当用户关闭该灯箱时,它也会关闭包含链接的 div。我可以在脚本中添加什么来阻止这种情况发生吗?

$(document).ready(function(){

$("a.dropdown-link").click(function(evt) {
  evt.preventDefault();
  var $div = $(this).next('.info-container');
  $(".info-container").not($div).slideUp();
    if ($div.is(":visible")) {
        $div.slideUp()
    }  else {
       $div.slideDown();
    }
});

$(document).click(function(e){
    var p = $(e.target).closest('.dropdown').length
    if (!p) {
          $(".info-container").slideUp();
    }
});
     $('.movie-link').magnificPopup({type:'iframe'});
});

<a class="dropdown-link" href="#"><div class="dropdown dropdown-processed">More info</div></a>
<div class="info-container" style="display: none;">Video preview: <a class="movie-link" href="videourl"></a></div>

我正在为灯箱使用 Magnific Popup:http://dimsemenov.com/plugins/magnific-popup/

我的 JavaScript 知识非常基础,因此不胜感激。

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    在“点击关闭div功能中,可以查看灯箱是否开启。一个简单的if ($("#lightbox").css("display") == "none")应该可以搞定

    编辑:将此行放在$(document).ready 行之后

    var state = 0; // default state
    $('.movie-link').click(function() { state = 1; }); // state = 1, lightbox on
    

    在源代码的第 384 行,插入这段代码

    state = 2; //state = 2, lightbox close button clicked
    

    当状态为 1(灯箱打开并单击灯箱内部或外部的随机内容)或 2(灯箱的关闭按钮被点击)时,这个想法不会触发“关闭 div”功能,并在以下情况下返回状态为 0是 2

    所以不要使用我在评论中提供的if 使用这个

    if (state == 2) {
        state = 0;
    } else if (state == 0) {
        //rest of the code
    }
    

    这只是我整理的东西,还没有测试,所以我实际上不知道它是否有效,所以只是备份你的js文件以防万一。

    编辑 2:

    删除编辑 1 中的所有更改并使用它而不是 if (state == 2) {

    if (e.target != $('.mfp-bg')[0] and e.target != $('.mfp-wrap')[0]) {
    

    编辑 3

    var e_class = $(e.target).attr('class');
    if (e_class != 'mfp-close' && e_class != 'mfp-container') {
    

    工作示例:http://imgcrash.comeze.com/test.html

    【讨论】:

    • 感谢您的代码,对不起,我不完全确定这应该去哪里。我只需要把它放在var p = $(e.target).closest('.dropdown').length 之前吗?
    • @jacobgibbs 是的,你需要用 {} 覆盖整个代码,但我想你已经知道了。
    • 你能看看我正在使用的灯箱示例吗?链接是dimsemenov.com/plugins/magnific-popup。特别是 youtube iframe 示例,它似乎没有使用 display:none。我可以做其他检查吗?
    • @jacobgibbs 只是想知道,但您是否将 #lightbox 更改为灯箱的正确 ID/类?我刚刚检查了网站上提供的示例,它是.mfp-wrap,但你这边可能会有所不同
    • 我做了,我没有更改弹出代码所以它仍然是.mfp-wrap。使用下面的代码,它允许我在不隐藏信息容器 div 的情况下关闭灯箱,但是当我单击 div 之外的任何位置时,它不会关闭。 $(document).click(function(e){ if ($(".mfp-wrap").css("display") == "none"){ var p = $(e.target).closest('.dropdown').length if (!p) { $(".info-container").slideUp(); } } });
    【解决方案2】:

    我不是 100% 没有实际测试这一点,但您可能会遇到 $(document).click(...); 的问题,因为单击 document 上的任何位置都会触发此事件。

    当您关闭弹出窗口时,您可能会触发此事件并向上滑动info-container div。

    您似乎正在寻找对 .dropdown 类的 div 的点击。为什么不使用类似的东西:

    $('.dropdown').click(function(e) { ... });

    【讨论】:

    • 我将$(document) 的两个引用都更改为$('.dropdown'),现在它允许您在不关闭信息容器div 的情况下关闭灯箱,但是当用户单击外部任何地方时,div 不会关闭现在就知道了。
    【解决方案3】:

    试试这个:

    $("a.dropdown-link").click(function(evt) {
      evt.preventDefault();
      evt.stopPropagation(); //We stop the propagation of the event
    
      //Changed it to slideToggle and added stop to prevent weird animation
        //on multiple clicks
      $(this).next('.info-container').stop().slideToggle()
    });
    
    $(document).click(function(e){
        //Check if it has the class info-container
        if (!$(e.target).hasClass("info-container")) {
              $(".info-container").slideUp();
        }
    });
         $('.movie-link').magnificPopup({type:'iframe'});
    

    Fiddle

    【讨论】:

    • 嗯,无论有没有 evt.stopPropagation,我在 jsfiddle 中看到了相同的行为,我错过了什么吗?
    • 感谢您的代码。尽管灯箱链接位于信息容器 div 中,但这似乎导致 div 在灯箱打开时向上滑动。
    • 如果你删除了 evt.stopPropagation(),添加到文档的点击事件也会收到点击事件,并且由于元素没有 info-container 类,它会在 slideDown 之后关闭容器,这就是区别,使用 stopPropagation 如果您单击链接,容器将接收 slideDown 动画,如果您单击其中的内容,它将保持打开状态,直到您单击外部的内容
    • 如果您在链接标签之间添加一些文本,您可以看到点击链接时 div 是如何再次向上滑动的。 Fiddle
    • 当您单击灯箱上的关闭按钮时,该示例似乎仍然关闭了 div?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2021-07-22
    • 2012-07-17
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多