实现效果:点击div 内部不隐藏,点击div外部则隐藏
网上找到的办法基本上是:
实现该div的click事件,并阻止冒泡。
实现document的click事件,隐藏该div。
这方法,有个bug,如果点击的元素的click,也阻止了冒泡,则无法实现效果。
本淫想到另一办法。使用focusin,focusout来实现。(貌似只有IE支持onfocusout,onfocusin)。查阅有关资料:onfocusout,onfocusin可冒泡。onfocus,onblur不支持冒泡。
设置div可获得焦点,添加属性 tabindex = "-1"。
使用jquery,不管浏览器的差异。
var divNode = $(该div);
//设置设div获得焦点
divNode.focus();
var t = 0;
divNode.bind("focusout", function() {
t = setTimeout(function() {
divNode.hide();
}, 0);
return false;
});
divNode.bind("focusin", function() {
if (t != null) {
clearTimeout(t);
}
return false;
});
这种方法bug是,tab切焦,会触发隐藏,单击滚动条不会隐藏。
浏览表现存在差异。
IE下点击地址栏,搜索栏,会触发隐藏。点该div的内部没有焦点的元素一样会触发focusout。而chrome则不会。(FF没有测试,本淫恶心FF!!!)
测试代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script> </head> <body > <div> <span id="test1btn"/>显示方法1div</span><span id="test2btn"/>显示方法2div</span></div> <div id='test1' style="display:none; background:rgb(0,153,255)"> <div style="width:100px; height:200px; background-color:rgb(204,204,204)">我是方法1内部元素</div> </div> <div id='test2' tabIndex="-1" style="display:none; background:rgb(153,153,153)"> <div style="width:100px; height:200px; background-color:rgb(0,153,255)">我是方法2内部元素</div> </div> <div style="width:100px; height:200px; background-color:rgb(255,204,153)" id="noBubble">我阻止了click冒泡,点我试试看。</div> <script type="text/javascript"> $(function(){ var divNode2 = $("#test2"); var divNode1 = $("#test1"); var t = null; $("#test2btn").click(function() { divNode2.css("display", "block"); //这里用jq的focus不能得到焦点。为什么?我想知道,谁能告诉我。难道不支持div获得焦点? //divNode2.focus(); //js原生态可以使div获得焦点。 document.getElementById("test2").focus(); }); divNode2.bind("focusout", function() { t = setTimeout(function() { divNode2.hide(); }, 0); return false; }); divNode2.bind("focusin", function() { if (t != null) { clearTimeout(t); } return false; }); $("#test1btn").click(function() { divNode1.show(); return false; }); divNode1.click(function() { return false; }); $(document).click(function(){ divNode1.hide(); }); $("#noBubble").click(function(){return false;}); }); </script> </body> </html>
走过,路过,过来看看,点评点评,学习学习!