Actionscript 3 中实现类似JQuery的mouseleave和mouseenter事件
October/15th 2010
最近在搞flash的东西。遇到一个事件冒泡带来的问题。类似Javascript,flash里面的元素也有事件冒泡机制。经常会遇到给一个外层的元素绑定一个mouse_over事件,本意是想实现进入这个外层的元素的时候触发。但是实现的时候却有很奇怪的表现:鼠标在这个元素内部移动的时候,遇到这个元素北部的元素的时候,内部元素触发mouse_over,这个事件会冒泡到外层这个元素,同样触发外层元素的mouse_over事件! 然后你就会发现,鼠标在这个外层元素内部移动的时候,绑定的事件会被触发很多次。
为了解决这个问题,JQuery自己实现了mouseenter和mouseleave事件,实现鼠标移入这个元素内部和离开这个元素的时候触发,鼠标在元素内部移动不会触发。原理我就不详细说了,大概是判断触发的对象与绑定事件的对象之间的关系吧。
在flash里面我自己实现了一个类似的东西,实现了mouseenter和mouseleave的响应。 大概原理是利用mouseover和mouseout的关系(在元素内部移动鼠标到内部的其他元素上的时候,会先触发mouseout,然后触发mouseover事件),把mouseout事件延后处理,然后看如果mouseover到了内部元素上,那就取消mouseout执行,否则触发mouseleave。呃。。。貌似很混乱。。。。核心思想就是利用setTimeout(function(){ },0); 把函数延后执行。
as代码:
function mouseEnterLeave(red,enterCall,leaveCall) { red.mouseOvering = false; //标记鼠标是否处在元素内部 red.addEventListener(MouseEvent.MOUSE_OVER,function(e:MouseEvent) { var ct = e.currentTarget; try{ clearTimeout(ct.outTimer); }catch(e:Error){ } if (!ct.mouseOvering) //如果从外面到里面,那么触发mouseEnter { enterCall.call(red); } ct.mouseOvering = true; }); red.addEventListener(MouseEvent.MOUSE_OUT,function(e:MouseEvent) { var ct = e.currentTarget; ct.outTimer = setTimeout(function() { //把mouseout响应延后执行,如果能执行,那么表示鼠标移出 ct.mouseOvering = false; leaveCall.call(red); },0); }); }
当然,这个函数也可以在Javascript中实现。就像这样:(非IE)
function mouseEnterLeave(o,enterCallback,leaveCallback) { o.addEventListener('mouseover',function(e) { try{ clearTimeout(o.outTimer); } catch(e) { } if (!o.overing) { if (typeof enterCallback == 'function') enterCallback.call(o); } o.overing = true; },false); o.addEventListener('mouseout',function(e) { o.outTimer = setTimeout(function() { o.overing = false; if (typeof leaveCallback == 'function') leaveCallback.call(o); },0); },false); }
Javascript的例子见这里(非IE浏览器)。
6323 read 3 comment(s)
添加新的评论
称呼:*邮件:*
网站:
内容:
你写的太专业了,只能能看懂一点点.