需求:
最近在做WEB程序时,有个需求是模拟IE7.0的收藏夹,做一个弹出菜单,而在点开该弹出菜单后,单击页面中的任何一个地方,都会使该弹出菜单隐藏掉(弹出菜单是一个DIV层).
问题:
页面中可能包括框架页或IFRAME页.如何控制他们包含页面的单击事件.
解决方案:
便励页面中的所有的FRAME,并为其添加BODY的ONCLICK事件.
所添加的BODY的ONCLICK事件,要便励当前窗体的父窗体,直到最后一层.并激活该页面的隐藏弹出菜单的事件.
代码:
var
clickEvent
=
function
()
...
{InitRootBodyClick();}
;
//
循环取出当前FRAME对象中包含的FRMAE,并为其包含的页面添加BODY的ONCLICK事件
function
InitIFrameBodyClick(frameObj, clickEvent)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(frameObj!=undefined && frameObj.document.body != null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
frameObj.document.body.onclick=clickEvent;
if(frameObj.frames.length > 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
var i;
for(i=0;i<frameObj.frames.length;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
InitIFrameBodyClick(frameObj.frames[i], clickEvent);
}
}
}
}
//
为指定的窗体对象找到其最顶级的父窗体对象,并激活该父窗体的BODY的ONCLICK事件
function
InitRootBodyClick(frameObj)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(frameObj == undefined)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
InitRootBodyClick(window.parent);
}
else if(frameObj.document.parentWindow != frameObj.document.parentWindow.parent)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
InitRootBodyClick(frameObj.document.parentWindow.parent);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
frameObj.document.body.click();
}
}
后来发现第二个方法可以直接用下面代码代替,因为在初始化各个页面的ONCLICK事件时,是在浮动菜单页面发生的,因此该window对象即为该页面的window对象,作为变量存储在各页面的ONCLICK事件中.
function
InitRootBodyClick()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
window.document.body.click();
}