<body>
<div id="aaa">
<div id="bbb">
</div>
</div>
</body>
$(#?????).click(function(){
$('#bbb').hide();
})
http://jsfiddle.net/GkRY2/点击外DIV
如果我想,如果用户点击隐藏#bbb箱#bbb外面我必须用?但是,如果我点击div #bbb,那么框仍然可见 - 只在外面。
<body>
<div id="aaa">
<div id="bbb">
</div>
</div>
</body>
$(#?????).click(function(){
$('#bbb').hide();
})
http://jsfiddle.net/GkRY2/点击外DIV
如果我想,如果用户点击隐藏#bbb箱#bbb外面我必须用?但是,如果我点击div #bbb,那么框仍然可见 - 只在外面。
$('body').click(function(e){
if(e.target.id == 'bbb')
{ return true; }
else
{ $('#bbb').hide(); }
});
解释说明:有几个w ays要做到这一点,无论哪种方式,我们需要倾听父母元素的点击,使其成为像#aaa
这样的直接父级,或者是像body
或document
这样的远亲。通过这种方式,我们可以捕获在#bbb
之外发生的点击。
既然我们有我们需要的.hide
不会发生如果用户点击#bbb
内部。我们可以通过两种方式执行此操作:
如果用户单击#bbb
,停止传播。这会使点击事件不是'bubble'直到父项。这种方式点击事件永远不会到达父母,所以#bbb
不会隐藏。我个人不喜欢这种方法,因为停止传播将全部点击来自冒泡的事件,并且你可能有点击事件,你想冒泡到本地父母而不是远方父母。或者你可能有听众从一个遥远的家长委派,这将停止工作,如果点击传播停止。
检查父侦听器中的#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;
});
捕获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/
这将工作
$("#aaa").click(function(){
$('#bbb').hide();
});
$("#bbb").click(function(event){
event.stopPropagation();
})
Becouse bbb is aaa事件将会“bubbel达到aaa”。所以,你必须使用event.stopPropagation
停止冒泡时BBB点击
我做了一个插件来做到这一点。它保留了this
的值,其中这些其他解决方案的this
值将参考document
。
https://github.com/tylercrompton/clickOut
用途:
$('#bbb').clickOut(function() {
$(this).hide();
});
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');
}
}
*考虑到文档车身高度和宽度
*移除事件侦听器,当你不需要他们
$(document).click(function(event) {
if(!$(event.target).closest('#elementId').length) {
if($('#elementId').is(":visible")) {
$('#elementId').hide('fast');
}
}
})
用您的div更改“#elementId”。
好的答案,但有一个额外的括号之外,如果条件结束点击()过早。 – kc2keo 2013-01-04 05:44:04
真的,我没有看到它。 – Fresheyeball 2013-01-04 18:28:32
我删除了最后一个括号后“if(e.target.id =='bbb'))”这是很好的去。我从看到的东西中过早地关闭了点击功能。最后一行应该是点击函数结束的地方。用那个括号不起作用。也许我看到这不正确? – kc2keo 2013-01-06 02:59:08