当前位置:  开发笔记 > 编程语言 > 正文

当用户在其外部单击时,使用jQuery隐藏DIV

如何解决《当用户在其外部单击时,使用jQuery隐藏DIV》经验,为你挑选了15个好方法。

我正在使用此代码:

$('body').click(function() {
   $('.form_wrapper').hide();
});

$('.form_wrapper').click(function(event){
   event.stopPropagation();
});

这个HTML:


问题是我在DIV内部有链接,当它们点击时它们不再有效.



1> 小智..:

有同样的问题,想出了这个简单的解决方案.它甚至可以递归工作:

$(document).mouseup(function(e) 
{
    var container = $("YOUR CONTAINER SELECTOR");

    // if the target of the click isn't the container nor a descendant of the container
    if (!container.is(e.target) && container.has(e.target).length === 0) 
    {
        container.hide();
    }
});


**记住**使用[`$("你的容器选择器").解绑('click',clickDocument);`(http://api.jquery.com/unbind/)就在*`.hide旁边( )`*.因此`document`不会继续听取点击.
只需将它放在我的项目中,但稍作调整,使用一系列元素一次循环遍历它们.http://jsfiddle.net/LCB5W/
对于最佳实践,我写了`$(document).on("mouseup.hideDocClick",function(){...});`在打开容器的函数中,``$(document).off(' .hideDocClick');`on hide function.使用[namespaces](http://api.jquery.com/on/#event-names)我没有删除附加到文档的其他可能的`mouseup`监听器.
我需要使用此事件隐藏容器一次,使用时应该销毁此回调.为此,我在使用bind("click.namespace")的click事件上使用了命名空间,当事件发生时,我调用unbind("click.namespace").最后,我使用$(e.target).closest(".container").length来识别容器...所以,我没有使用这个答案的任何技巧:D
@mpelzsherman很多人评论说这个代码片段适用于触摸设备但是由于帖子已被编辑,这些评论有些消失了.TBH我不知道我是否因为某个特定原因使用了"mouseup",但如果它也适用于"click",我认为没有理由不使用"click".
此解决方案没有考虑到事件应该只抛出一次.
2个问题:1)这与触摸设备有关吗?2)有没有理由使用mouseup与click?
@brasofilo这对我不起作用.获取ReferenceError:未定义clickDocument.因为没有处理程序.处理程序应该怎么样?!

2> Makram Saleh..:

你最好选择这样的东西:

var mouse_is_inside = false;

$(document).ready(function()
{
    $('.form_content').hover(function(){ 
        mouse_is_inside=true; 
    }, function(){ 
        mouse_is_inside=false; 
    });

    $("body").mouseup(function(){ 
        if(! mouse_is_inside) $('.form_wrapper').hide();
    });
});


这不适用于平板电脑,因为你无法悬停!
我不认为这是一个很好的解决方案,因为它让人们认为填充window-object(=使用全局变量)是可以的.
@ prc322如果您甚至不知道如何更改变量的范围,那么您是对的,这个解决方案对您不利......而且JavaScript也不是.如果你只是从Stack Overflow复制和粘贴代码,那么你可能会遇到很多问题,而不是覆盖窗口对象中的某些东西.

3> Case..:

此代码检测页面上的任何单击事件,然后#CONTAINER当且仅当单击的#CONTAINER元素既不是元素也不是其后代之一时隐藏元素.

$(document).on('click', function (e) {
    if ($(e.target).closest("#CONTAINER").length === 0) {
        $("#CONTAINER").hide();
    }
});



4> David Andres..:

您可能希望检查为正文触发的单击事件的目标,而不是依赖于stopPropagation.

就像是:

$("body").click
(
  function(e)
  {
    if(e.target.className !== "form_wrapper")
    {
      $(".form_wrapper").hide();
    }
  }
);

此外,主体元素可以不包括浏览器中所示的整个视觉空间.如果您注意到您的点击未注册,则可能需要添加HTML元素的点击处理程序.


-1.当您单击其中一个子项时,这会隐藏`form_wrapper`,这不是所需的行为.请改用prc322的答案.

5> Salim..:

现场演示

检查点击区域不在目标元素中或在其子元素中

$(document).click(function (e) {
    if ($(e.target).parents(".dropdown").length === 0) {
        $(".dropdown").hide();
    }
});

更新:

jQuery停止传播是最好的解决方案

现场演示

$(".button").click(function(e){
    $(".dropdown").show();
     e.stopPropagation();
});

$(".dropdown").click(function(e){
    e.stopPropagation();
});

$(document).click(function(){
    $(".dropdown").hide();
});



6> meder omural..:
$(document).click(function(event) {
    if ( !$(event.target).hasClass('form_wrapper')) {
         $(".form_wrapper").hide();
    }
});


不要检查目标是否有类,请尝试:if($(event.target).closest('.form_wrapper).get(0)== null){$(".form_wrapper").hide(); 这将确保点击div内部的内容不会隐藏div.
嗯......如果我点击div中的内容,整个div会因某种原因消失.

7> benvds..:

将解决方案更新为:

改用mouseenter和mouseleave

悬停使用实时事件绑定

var mouseOverActiveElement = false;

$('.active').live('mouseenter', function(){
    mouseOverActiveElement = true; 
}).live('mouseleave', function(){ 
    mouseOverActiveElement = false; 
});
$("html").click(function(){ 
    if (!mouseOverActiveElement) {
        console.log('clicked outside active element');
    }
});



8> Martin Vseti..:

最流行的答案是没有jQuery的解决方案:

document.addEventListener('mouseup', function (e) {
    var container = document.getElementById('your container ID');

    if (!container.contains(e.target)) {
        container.style.display = 'none';
    }
}.bind(this));

MDN:https://developer.mozilla.org/en/docs/Web/API/Node/contains



9> Roko C. Bulj..:

具有ESC功能的现场演示

适用于桌面和移动设备

var notH = 1,
    $pop = $('.form_wrapper').hover(function(){ notH^=1; });

$(document).on('mousedown keydown', function( e ){
  if(notH||e.which==27) $pop.hide();
});

如果在某些情况下,您需要确保在单击文档时确实可以看到元素: if($pop.is(':visible') && (notH||e.which==27)) $pop.hide();



10> 小智..:

不会像这样的工作吗?

$("body *").not(".form_wrapper").click(function() {

});

要么

$("body *:not(.form_wrapper)").click(function() {

});


这个答案是不正确的.像这里的许多答案一样,当你点击它的子句(以及其他问题)时,这将隐藏`.form_wrapper`.

11> 小智..:

您可以设置tabindex为父级

并监听focusout事件,而不是监听DOM来隐藏一个特定元素,而无需每次单击。

设置tabindex将确保在blur上触发事件

(通常不会触发)。

因此,您的HTML如下所示:


还有你的JS:

$('.form_wrapper').on('focusout', function(event){
    $('.form_wrapper').hide();
});



12> 小智..:

甚至是运动鞋:

$("html").click(function(){ 
    $(".wrapper:visible").hide();
});


这个答案是不正确的。无论您在页面上的什么位置,这都将隐藏.wrapper,这不是要求的。

13> djv..:

这是我在另一个线程上找到的jsfiddle,它也可以使用esc键:http : //jsfiddle.net/S5ftb/404

    var button = $('#open')[0]
    var el     = $('#test')[0]

    $(button).on('click', function(e) {
      $(el).show()
      e.stopPropagation()
    })

    $(document).on('click', function(e) {
      if ($(e.target).closest(el).length === 0) {
        $(el).hide()
      }
    })

    $(document).on('keydown', function(e) {
      if (e.keyCode === 27) {
        $(el).hide()
      }
    })



14> Code Spy..:

对于IPAD和IPHONE等触控设备,我们可以使用以下代码

$(document).on('touchstart', function (event) {
var container = $("YOUR CONTAINER SELECTOR");

if (!container.is(e.target) // if the target of the click isn't the container...
&& container.has(e.target).length === 0) // ... nor a descendant of the container
    {
        container.hide();
    }
});



15> WiseOlMan..:

基于prc322的出色回答。

function hideContainerOnMouseClickOut(selector, callback) {
  var args = Array.prototype.slice.call(arguments); // Save/convert arguments to array since we won't be able to access these within .on()
  $(document).on("mouseup.clickOFF touchend.clickOFF", function (e) {
    var container = $(selector);

    if (!container.is(e.target) // if the target of the click isn't the container...
        && container.has(e.target).length === 0) // ... nor a descendant of the container
    {
      container.hide();
      $(document).off("mouseup.clickOFF touchend.clickOFF");
      if (callback) callback.apply(this, args);
    }
  });
}

这增加了几件事...

    放在带有“无限” args回调的函数中

    添加了对jquery的.off()的调用以及事件名称空间,以在事件运行后将其与文档解除绑定。

    随附的用于移动功能的触摸端

我希望这可以帮助别人!

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有