////【标志位】
var close_it = true;
function hiddenPopup(){ close_it=true;
var src_e = event.fromElement;
if(src_e.id==null || src_e.id==""){
event.stopPropagation();
console.log("stop it===");
return;
}
console.log(src_e.id+"##hiddenPopup==="+close_it);
setTimeout(function() {
reallyCloseit();
}, 1500);
}
//取消关闭事件
function cancelCloseit(){
var src_e = event.fromElement;
if(src_e.id==null || src_e.id==""){
event.stopPropagation();
console.log("stop it===");
return;
}
console.log(src_e.id+"##cancelCloseit=false");
close_it=false;
}
//真正关闭DIV:id=popupcontent
//close_it是标记位,延长时间段内可以修改。
function reallyCloseit(){
if(!close_it){
console.log("return,close_it="+close_it);
return;
}
console.log("reallyCloseit=OKOK"+close_it);
var popUp = document.getElementById("popupcontent");
popUp.style.visibility = "hidden";
popUp.innerText="";
}
//这个函数是显示DIV的。
function showPopup(top,left,w,h){}dom模型
这个是【开关】,但鼠标经过时候,弹出一个DIV,离开这个【开关】,过1.5秒钟就关闭这个DIV(方法hiddenPopup),
这1.5秒钟内,如果把鼠标移动到【弹出窗口】,那么这个【弹出窗口】不关闭。
<div id="trick" onmouseover="showPopup(打开窗口的开关);" onmouseout="hiddenPopup(关闭窗口);">
这个是【弹出窗口】,onmouseover事件调用cancelCloseit();方法
在1.5秒钟内改变了【标志位】close_it的bool值,窗口不会关闭。
离开这个【弹出窗口】,过1.5秒钟就关闭这个DIV(方法hiddenPopup)
<div id="popupcontent" onmouseover="cancelCloseit();" onmouseout="hiddenPopup();">
<span>很多动态添加的标签SPAN</span><span>很多动态添加的标签SPAN</span><span>很多动态添加的标签SPAN</span>...
</div>
总之,功能就是当鼠标点开【弹出窗口】后,如果鼠标在开关或者这个【弹出窗口】上面,那就不关闭【弹出窗口】
否则,1.5s内关闭窗口。
解决方案 »
- javascript之for in 循环用法请教
- 关于IE状态栏的高度
- 怎么能不让用户关闭当前窗口
- DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN 导致javascript 不执行
- 提问:有关history.back()#######################
- javascript中怎么判断函数是否存在?
- 可以在框架的一个frame中定义另一个frame的onkeydown事件吗
- 用insertRow插入的表格的行,怎么给他加入事件?谢!
- 初学htc,大家帮忙看看怎么回事
- Js萌新求助 怎么把一串单词的每个首字母转成大写,其他不变
- Javascript的setInterval使用中遇到的问题
- 怎样用jquery取得下拉列表中自定义属性的值
var popUp = document.getElementById("popupcontent");
var nodes = popUp.getElementsByTagName("span");
for(var k=0;k<nodes.length;k++){
nodes[k].addEventListener('mouseup', function(e) { e.stopPropagation(); }, false);
}问题在于<span>,事件会冒泡,<span>的事件已经全部屏蔽了。
<span>很多动态添加的标签SPAN</span>,这是麻烦的问题。
当鼠标进入<span></span>,会触发<div id="popupcontent" onmouseout="hiddenPopup();">这个事件。虽然span在这个div里面,但是也还是触发了鼠标移出事件。
因为有很多span标签,所以定时延后关闭有错误,会意外关闭。请问各位如何处理?
谢谢帮忙,我是菜青虫。
操作【标志位】close_it的bool值
关闭窗口先调用hiddenPopup();这个hiddenPopup()会调用定时器,延长时间执行,在这段时间内,【标志位】close_it这个标志位会改变。要是可以获取鼠标当前位置在Span里面,也可以用于控制【弹出窗口】的效果
怎么做?
这1.5秒钟内,如果把鼠标移动到【弹出窗口】,那么这个【弹出窗口】不关闭。
这个就是【开关】上面onmouseover和onmouseout事件,【弹出窗口】上面onmouseover事件吧延迟1.5么可以用 setTimeOut(hiddenPopup(),1500);有很多span标签,所以定时延后关闭有错误,会意外关闭。这个你设置ID就能解决了啊,ID别重复了 仔细检查PS:最好来个全的代码 代码补全吧 零零散散的看的我眼花缭乱
close_it=false;
if(!close_it){
console.log("return,close_it="+close_it);
return;
}
console.log("reallyCloseit=OKOK"+close_it);
var popUp = document.getElementById("popupcontent");
popUp.style.visibility = "hidden";
popUp.innerText="";
}
先检查下。用true和false钉死,看效果,再检查下。close_it的赋值。
这个问题可以考虑用事件的event.srcElement||event.Target目标源来解决,如果源头ID不是DIV就不执行,如果是就执行,这样就不会出现离开SPAN而去触发div id="popupcontent" onmouseout这个事件!
var nodes = popUp.getElementsByTagName("span");
for(var k=0;k<nodes.length;k++){
nodes[k].addEventListener('mouseup', function(e) { e.stopPropagation(); }, false);
}
你这么多代码的目的就是防冒泡,其实一个源头判断即可解决,不需要这么多代码循环判断!
比如:
function hiddenPopup(){ close_it=true;
var src_e = event.fromElement;
if(src_e.id==null || src_e.id==""){
event.stopPropagation();
console.log("stop it===");
return;
}
console.log(src_e.id+"##hiddenPopup==="+close_it);
setTimeout(function() {
reallyCloseit();
}, 1500);
}
可以试着改:为:function hiddenPopup(){ close_it=true;
var src_e = event.srcElement||event.Target
if(src_e.id!="popupcontent"){
//event.stopPropagation();这里什么也不执行
//console.log("stop it===");
return;//如果源头id非DIV的id,即直接返回就好
}
console.log(src_e.id+"##hiddenPopup==="+close_it);
setTimeout(function() {
reallyCloseit();
}, 1500);
}
郁闷的问题是,这个id="popupcontent"的div会触发onmouseout="hiddenPopup();"
当我的鼠标在这个id="popupcontent"的div【里面】移动,到span里面去了,就触发了onmouseout事件。
当移到div【外面】触发这个事件就好了。功能就实现了。要是能解决在div里面span中不触发这个事件?怎么弄?
谢谢@falizixun2
@falizixun2