【发布时间】:2010-08-11 17:37:58
【问题描述】:
当用户单击页面上除框区域以外的任何位置时,我想关闭页面中的一个小弹出框。怎么找?
【问题讨论】:
标签: javascript jquery
当用户单击页面上除框区域以外的任何位置时,我想关闭页面中的一个小弹出框。怎么找?
【问题讨论】:
标签: javascript jquery
$(document.body).click(function(e){
var $box = $('#little-pop-up-box-id');
if(e.target.id !== 'little-pop-up-box-id' && !$.contains($box[0], e.target))
$box.remove();
});
e.target 是收到click event 的DOM node。我首先检查该元素的 ID 是否不是我们正在寻找的那个。
第二次检查!$.contains($box[0], e.target) 确保DOM node of invocation 不在我们要隐藏的元素内。
好吧,我想现在是插件时间! :
(function($){
$.fn.outside = function(ename, cb){
return this.each(function(){
var $this = $(this),
self = this;
$(document.body).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));
概要
$('#container').outside('click', function(e){
$(this).remove();
});
示例:
【讨论】:
.unbind().. 我想这可以在几个地方进行优化。使用.delegate() 甚至是一个好主意。谁他妈的需要本·阿尔曼? :) j/k
@jAndy 的解决方案很好,但我也想提一下Ben Alman's "Outside Events" plugin。这是一个使用它的简单示例:
$("#popup").bind("clickoutside", function(event){
$(this).hide();
});
【讨论】:
$("html").click(function(){
//close popup
});
【讨论】:
抓取全局点击事件,或在弹出框下方设置透明div 100%/100%。
【讨论】: