onmouseout事件在Firefox与ie的select上的不同造成的麻烦:
onmouseout事件在Firefox与ie的select上的不同造成的麻烦:
我最近在设计一个界面,用到了一个自动出现和隐藏的列表选择select.
所以我把它放在一个div里面,必须支持firefox,但我在测试firefox的onmouseout事件时,发现它的
onmouseout事件远比ie里复杂,在ie里仅select本身有这个onmouseout事件,但在firefox里面不仅
Select有这个事件,而且里面的option,scrollBar等都有这个事件,尽管我只在select 上设置了这个事件,但里面的option,scrollBar等都触发这个事件,
这样我的事件处理就变成了这样:
if(event.srcElement){
element=event.srcElement;
}else{
element=event.target;
var rele=event.relatedTarget;
//debugInfo.value=debugInfo.value+'\nCurrent Node='+element.nodeName+ ' related Node='+rele.nodeName;
if(rele.nodeName=='OPTION' && element.nodeName=='OPTION'){
return;
}
if(rele.nodeName=='OPTION' && element.nodeName=='SELECT'){
return;
}
if(rele.nodeName=='SELECT' && element.nodeName=='OPTION'){
return;
}
}
// do something...
看到没有,一个onmouseout 可能有许多种情况,从一个OPTION移动到另外一个OPTION,
从一个OPTION移动到SELECT,从一个OPTION移动到scrollBar,从一个scrollBar移动到OPTION,
从一个scrollBar移动到SELECT等等等等,更气人的是可以直接从OPTION移动到SELECT甚至div外面。
我的代码显然不是一个好的处理模式。有哪位高人有更好的解决方法吗?
问题点数:100、回复次数:9Top
1 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-18 08:36:43 得分 30
srcElement的tagname和parent的tagName一起判断,或者在select外面放一个span/div,在那里捕获onmouseoutTop
2 楼wuyg(平平)回复于 2006-03-18 08:54:03 得分 0
问题是只要鼠标移动得够快,就可以跳过中间的元素,直接从最里面到最外面了。
Top
3 楼woyingjie(Hobo)回复于 2006-03-18 09:02:00 得分 40
<select onmouseout="alert(this.tagName);">
<option onmouseout="event.stopPropagation();">1</option>
<option>2</option>
<option>3</option>
</select>Top
4 楼wuyg(平平)回复于 2006-03-19 06:43:13 得分 0
to woyingjie(沃英杰) :
这样每个option必须要设置,很麻烦,更麻烦的是在firefox里面,multiple select 列表框
不管options的数量,都会自动显示垂直滚动条,而这个滚动条上是没有办法加上这个事件的。Top
5 楼wuyg(平平)回复于 2006-03-20 20:45:21 得分 0
顶Top
6 楼hansonboy(hansonboy)回复于 2006-03-21 09:12:14 得分 0
还没试过, 不过一提到firefox就烦, 不知哪个做它出来干嘛的, 做出来又不做好点, 害得我们程序员半死Top
7 楼wuyg(平平)回复于 2006-03-21 20:35:56 得分 0
我并不认为这个firefox的事件模型不好,只是与ie不同。试想你想要精确控制select本身,就可能需要这么多事件。Top
8 楼wuyg(平平)回复于 2006-05-04 21:54:06 得分 0
有谁能帮帮我?Top
9 楼wtogether(wtogether)回复于 2006-05-05 18:02:19 得分 30
把event作为参数传就可以了
function event_test(e)
{
var ee = window.event || e;//这个ee就是event了
if (ee.srcElement)
{
//ie 的event元素
}
else if (ee.target)
{
/firefox的event元素
}
}
<select onmouseout="alert(this.tagName);">
<option onmouseout="event_test(event);">1</option>
<option>2</option>
<option>3</option>
</select>Top




