怎么判断鼠标移入一个Popup窗口呢?

简介:

   在使用popup窗口构建Web菜单一文中,我曾比较的详细的介绍了popup窗口的使用方法和一些注意事项。今天发现要判断鼠标是否移入一个popup窗口,还挺有些郁闷,不过最后还算找到了一个解决办法。

    为什么要判断一个鼠标动作是不是移入一个popup窗口呢?当我们在一个ToolBar上移动鼠标时,会在鼠标移入每个button时产生一个focus的效果,鼠标移走就resume。可是如果我们点击了button,而这个button又是那种弹出下拉菜单的那种,我们希望鼠标在移入菜单中时,button上的focus效果不要resume。这时就需要判断鼠标是否移入了一个popup窗口(菜单是使用popup制作的),而不是普通的onmouseout。如下图所示:
   ToolBarMenuButton.gif
    如果我们在toolbar的button上执行正常的onmouseout,将不能得到图4的那个效果,而button会像图2种那样被resume。本来想给被点击的button加一些状态值,可是这样一来如果我们使用Esc键隐藏了菜单,那么没有办法resume button里的状态。最后发现event里的一堆参数可以帮组我们判断鼠标的移动状态,event.srcElement是我们品是最常用的一个属性,而event还提供了两个Element参数,一个是toElement另一个是fromElement,顾名思义,就是事件触发的源和目的HMTL元素。记得在popup构建菜单一文中,我分析过host window的document对象和popup的document对象之间的关系,由于它们是独立的document对象,而event对象的srcElement、toElement和fromElement必须来自同一个doucment对象。所以当一个鼠标从host window.document移入popup.doucment时,event.toElement将是空值null!相同的如果鼠标从popup中移入host window中,这是触发的事件event.toElement也将是空值null。

    根据上面分析,我们的button元素上的onmouseout就可以精确的判断鼠标的状态,示例代码如下:

xxxButton.__OnMouseOut =  function()
{
     var evt =  this.document.parentWindow.event;
     if ( evt )
    {
         if ( evt.toElement && evt.fromElement )
        {
             //  这是正常的onmouseout状态
        }
         else
        {
             //  这是鼠标进入popup窗口的状态
        }
    }
};

    再考虑考虑,可不可能有这种情况,一个鼠标事件event只有toElement而没有fromElement呢

    当然可能有了,上面的情况中,在popup里如果截获onmouseover,就没有fromElement。当然就算browser里没有popup窗口,我们也是可能遇到event的fromElement为空的情况的,我们把browser从非active状态转为active状态(特别是使用alt+tab时),如果这时鼠标光标落在browser中的一个响应onmouseover的元素上,这时当然也会触发onmouseover事件,并且这时event对象中就只有toElement和srcElement有值,而fromElement就是空的。


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

目录
相关文章
|
4月前
|
图形学
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
|
7月前
|
JavaScript 前端开发
鼠标移出和鼠标移入事件
鼠标移出和鼠标移入事件
44 1
|
7月前
基于elementUI的el-table组件实现按住某一行数据上下滑动选中/选择或取消选中/选择鼠标经过的行
基于elementUI的el-table组件实现按住某一行数据上下滑动选中/选择或取消选中/选择鼠标经过的行
|
7月前
el-table 取消鼠标移入时变色
el-table 取消鼠标移入时变色
94 0
element-plus菜单折叠以后图标消失
element-plus菜单折叠以后图标消失
159 0
|
编解码
【PyAutoGUI操作指南】02 鼠标控制功能+获取当前坐标+鼠标事件+鼠标滚动查询
左上角的像素位于坐标0,0。如果屏幕分辨率为1920 x 1080,则右下角的像素将为1919,1079(因为坐标从0开始,而不是1)。
543 0
VC下利用Picture控件实现png图片按钮(鼠标初始、按下、松开、获得焦点四种状态)
VC下利用Picture控件实现png图片按钮(鼠标初始、按下、松开、获得焦点四种状态)
133 0
|
Java
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
488 0
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
|
API
用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击)
网上搜到的答案普遍是VBS无法实现,或者是要用第三方COM(ActiveX?)组件。我对第三方组件是很反感的,使用第三方组件毫无可移植性可言,因为别人的系统中不一定注册了这个组件。我的建议是,尽量不要在VBS代码中调用第三方组件,除非你的程序只是写来自己用。
2278 0