处理IE中Bubble Up 事件模型的细节

  1. 云栖社区>
  2. 博客>
  3. 正文

处理IE中Bubble Up 事件模型的细节

唐玄奘 2017-12-19 00:48:00 浏览858
展开阅读全文

  我们都知道,IE实现的是一种叫做bubble up的事件模型。在这个模型中我们的事件可以通过Web页元素的hierarchy,从事件触发元素向其parentElement传递,除非被显示的cancel。不过在一些复杂的事件响应处理中,还有很多细节需要仔细考虑。

    对于Web元素可侦听的事件来说,大多数的事件都是比较简单的。比如什么onload、onclick、onkeypress、onmousedown、onmouseup等等。但是却有一些是比较麻烦的,比如onmousemove、onmouseover和onmouseout。为什么说这几个比较麻烦呢?因为这几个事件一般会比较频繁的被触发,而且onmouseover和onmouseout还更加特殊,这两个事件还会影响event的toElement和fromElement属性。

    同时onmouseover和onmouseout以及onmousemove还是不确定的事件,什么意思呢?就是说当鼠标从html元素上移动时,不是100%能触发这几个事件。这是因为,浏览器中dhtml的事件触发是在浏览器事件处理进程合理idle的时候,根据用户的和浏览器的交互遍历dhtml树的状态来产生的。当浏览器事件处理进程太忙,或者用户交互过于密集的时候,由于IE没有事件队列,没有被处理的事件就再也不会出发了。这里的事件丢失是完全可以接受的,如果不作丢弃浏览器的交互反而会非常的难用。就常常会出现这种情况,有时当我们的windows太繁忙而不立即响应鼠标事件时,我们却到处点击鼠标想"激活"系统,系统在忙完那个费时的处理后,会来接着处理message queue里的一大堆message,我们就能看到刚才点过的鼠标操作都被windows连续处理了emdgust.gif

    回头继续说我们事件处理中的细节问题。看下面这个示例:

     this is a inner span element.  blogyuanadmin.gif


    我们在最外面的蓝色span元素中监听事件onmouseover,代码为:

None.gif onmouseover="status=event.srcElement.style.borderColor + ', timestamp: ' + new Date()"

    当我们把鼠标移入蓝色region,我们看到status上显示"blue"。我们继续在蓝色region中移动鼠标时(不要和别的边相交),我们发现onmouseover在blue时的timestamp不变,说明如果鼠标已进入一个element的区域中,就不再触发onmouseover了(否则就成了onmousemove了)。可是这个时候如果我把鼠标移入绿色红色的region中,我们发现又有新的onmouseover事件被触发并被蓝色span元素截获。而且不断的在绿色红色蓝色regions中移动鼠标,timestamp也在不断地变,说明总有onmouseover事件被触发。

    其实既然都说了IE的事件处理方式是bubble up,那么蓝色span截获绿色红色regions中的onmouseover似乎是对的。可是对于蓝色span来说,这些被多余触发的onmouseover事件其实是不被期望的。IE没有做这个过滤,不知道是出于什么目的,不过我们可以自己在脚本中过滤掉这样的useless事件,有时这些事件很可能会干扰我们做精确的对蓝色span进行事件控制。假设蓝色span的onmouseover事件handler为isAbsoluteMoveOver,代码如下:

 1None.giffunction isAbsoluteMoveOver(elmt)
 2None.gif{
 3None.gif    if ( event )
 4None.gif    {
 5None.gif        var tagName = elmt.tagName;
 6None.gif        var to = FindParentElement(event.toElement, tagName);
 7None.gif        var from = FindParentElement(event.fromElement, tagName);
 8None.gif        if ( elmt === to && from === to )
 9None.gif        {
10None.gif            return false;
11None.gif        }
12None.gif    }
13None.gif    return true;
14None.gif}

    这时只有在鼠标移入或移出蓝色span时,isAbsoluteMoveOver才返回true!


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

网友评论

登录后评论
0/500
评论