2012-08-06 85 views
5
<body> 
    <div id="aaa"> 
     <div id="bbb"> 
     </div> 
    </div> 
</body> 


$(#?????).click(function(){ 

    $('#bbb').hide(); 

}) 

http://jsfiddle.net/GkRY2/点击外DIV

如果我想,如果用户点击隐藏#bbb箱#bbb外面我必须用?但是,如果我点击div #bbb,那么框仍然可见 - 只在外面。

回答

12
$('body').click(function(e){ 
     if(e.target.id == 'bbb') 
      { return true; } 
     else 
      { $('#bbb').hide(); } 

}); 

解释说明:有几个w ays要做到这一点,无论哪种方式,我们需要倾听父母元素的点击,使其成为像#aaa这样的直接父级,或者是像bodydocument这样的远亲。通过这种方式,我们可以捕获在#bbb之外发生的点击。

既然我们有我们需要的.hide不会发生如果用户点击#bbb内部。我们可以通过两种方式执行此操作:

  1. 如果用户单击#bbb,停止传播。这会使点击事件不是'bubble'直到父项。这种方式点击事件永远不会到达父母,所以#bbb不会隐藏。我个人不喜欢这种方法,因为停止传播将全部点击来自冒泡的事件,并且你可能有点击事件,你想冒泡到本地父母而不是远方父母。或者你可能有听众从一个遥远的家长委派,这将停止工作,如果点击传播停止。

  2. 检查父侦听器中的#bbb元素。这是上面显示的方法。基本上,这听取了一个遥远的父母,并且当点击发生时,它检查以确定该点击是否在#bbb上。如果它不在#bbb.hide被触发,否则返回true,所以其他可能与click事件绑定的事件将继续工作。我更喜欢这种方法,但其次,它的可读性和可读性略高一些。

最后,您检查点击是否源于#bbb的方式有很多选项。任何工作都会奏效,这种模式就是这件事的真正内容。

http://jsfiddle.net/tpBq4/ //改为@Raminson,他的回答非常相似。


新的建议,利用没有jQuery的事件冒泡。

var isOutSide = true 
    bbb  = documment.getElementById('bbb'); 
document.body.addEventListener('click', function(){ 
    if(!isOutSide){ 
     bbb.style.display = 'none'; 
    } 
    isOutSide = true; 
}); 

bbb.addEventListener('click', function(){ 
    isOutSide = false; 
}); 
+0

好的答案,但有一个额外的括号之外,如果条件结束点击()过早。 – kc2keo 2013-01-04 05:44:04

+0

真的,我没有看到它。 – Fresheyeball 2013-01-04 18:28:32

+0

我删除了最后一个括号后“if(e.target.id =='bbb'))”这是很好的去。我从看到的东西中过早地关闭了点击功能。最后一行应该是点击函数结束的地方。用那个括号不起作用。也许我看到这不正确? – kc2keo 2013-01-06 02:59:08

4

捕获click事件,因为它会冒泡到document元素。当它遇到document元素时,隐藏该元素。然后在该元素的click事件处理程序,阻止事件的传播,因此不会达到document元素:

$(function() { 
    $(document).on('click', function() { 
     $('#bbb').hide(); 
    }); 
    $('#bbb').on('click', function (event) { 
     event.stopPropagation(); 
    }); 
}); 

下面是一个演示:http://jsfiddle.net/KVXNL/

Google文档event.stopPropagation()http://api.jquery.com/event.stopPropagation/

0

这将工作

$("#aaa").click(function(){ 

    $('#bbb').hide(); 

}); 

$("#bbb").click(function(event){ 

    event.stopPropagation(); 
})​ 

Becouse bbb is aaa事件将会“bubbel达到aaa”。所以,你必须使用event.stopPropagation停止冒泡时BBB点击

http://jsfiddle.net/GkRY2/5/

1

您可以使用事件对象的target属性,尝试以下操作:

$(document).click(function(e) { 
    if (e.target.id != 'bbb') { 
      $('#bbb').hide(); 
    } 
}) 

DEMO

+1

不需要从'e.target'中创建一个jQuery对象...''e.target.id'就可以正常工作。 – Jasper 2012-08-06 19:35:43

+0

我没有投票,但很有趣,你的是唯一的答案,得到了任何发挥,它得到了一个一个投票和一个投票... – Jasper 2012-08-06 19:40:27

2

我做了一个插件来做到这一点。它保留了this的值,其中这些其他解决方案的this值将参考document

https://github.com/tylercrompton/clickOut

用途:

$('#bbb').clickOut(function() { 
    $(this).hide(); 
}); 
0

OK

*这是没有的jQuery。你可以伊斯利修改它与IE

工作

首先创建的helper方法,以方便在作弄我不要混淆使用jQuery $()

function $g(element) { 

    return document.getElementById(element); 

    } 

创建我们的监听类

function globalClickEventListener(obj){ 

    this.fire = function(event){ 
     obj.onOutSideClick(event); 
     } 
    } 

让我们说我们需要捕获文档主体上的每一次点击

因此我们需要创建侦听器数组并初始化我们的工作。这种方法将在负载被称为

 function initialize(){ 

    // $g('body') will return reference to our document body. parameter 'body' is the id of our document body 

    $g('body').globalClickEventListeners = new Array(); 
    $g('body').addGlobalClickEventListener = function (listener) 
    { 
     $g('body').globalClickEventListeners.push(listener); 

    } 

    // capture onclick event on document body and inform all listeners 

    $g('body').onclick = function(event) { 
     for(var i =0;i < $g('body').globalClickEventListeners.length; i++){ 
      $g('body').globalClickEventListeners[i].fire(event); 
     } 
    } 

} 
初始化之后,我们创建事件侦听器和传递需要知道我们的文档每clcik对象的引用

function goListening(){ 

     var icanSeeEveryClick = $g('myid'); 
     var lsnr = new globalClickEventListener(icanSeeEveryClick); 

     // add our listener to listeners array 

     $g('body').addGlobalClickEventListener(lsnr); 

     // add event handling method to div 

     icanSeeEveryClick.onOutSideClick = function (event){ 
      alert('Element with id : ' + event.target.id + ' has been clicked'); 
     } 

    } 

*考虑到文档车身高度和宽度

*移除事件侦听器,当你不需要他们

0
$(document).click(function(event) { 
    if(!$(event.target).closest('#elementId').length) { 
     if($('#elementId').is(":visible")) { 
      $('#elementId').hide('fast'); 
     } 
    }   
}) 

用您的div更改“#elementId”。