原文地址:http://tangdonglai.iteye.com/blog/1291040
项目中要用到Flex与Iframe结合,但是在使用的过程中出现了一些问题,Flex Pop出来的窗口都会被Iframe给遮住,在网上找了很多资料但是都没办法完全解决,网上很多都说在pop窗口时把Iframe的visbale设置为false,但是这样的解决办法不是很好,所以在看了google的Iframe原代码后,发现Iframe是被动态显示出来的,也就是说Iframe始终会显示在最上层,那么在发现这个问题之后,想了如下办法:
1、首先把Iframe的位置,也就是zIndex设置为-1,让他显示在最底层。
2、光显示在最底层是不够的,因为Iframe会被Flex编译出来的swf所覆盖,所以需要把Flex的背景设置为透明,才能显示出来
3、设置为透明显示出来之后如果想在Iframe上进行操作还需要添加鼠标事件(在鼠标移到iframe上的时候把层的zIndex设置为1,离开时设置为-1)
具体看如下代码:
首先修改Iframe的IFrameExternalCalls.as源代码:
把zIndex设置为-1
- public static var INSERT_FUNCTION_CREATEIFRAME:String =
- "document.insertScript = function ()" +
- "{ " +
- "if (document." + FUNCTION_CREATEIFRAME + "==null)" +
- "{" +
- FUNCTION_CREATEIFRAME + " = function (frameID, overflowAssignment)" +
- "{ " +
- "var bodyID = document.getElementsByTagName(\"body\")[0];" +
- "var newDiv = document.createElement('div');" +
- "newDiv.id = frameID;" +
- "newDiv.style.position ='absolute';" +
- "newDiv.style.backgroundColor = '#FFFFFF';" +
- "newDiv.style.border = '0px';" +
- "newDiv.style.overflow = overflowAssignment;" +
- <STRONG> </STRONG>"newDiv.style.zIndex = '-1';"<STRONG> </STRONG>+
- "newDiv.style.display = 'none';" +
- "bodyID.appendChild(newDiv);" +
- "}" +
- "}" +
- "}";
public static var INSERT_FUNCTION_CREATEIFRAME:String = "document.insertScript = function ()" + "{ " + "if (document." + FUNCTION_CREATEIFRAME + "==null)" + "{" + FUNCTION_CREATEIFRAME + " = function (frameID, overflowAssignment)" + "{ " + "var bodyID = document.getElementsByTagName(\"body\")[0];" + "var newDiv = document.createElement('div');" + "newDiv.id = frameID;" + "newDiv.style.position ='absolute';" + "newDiv.style.backgroundColor = '#FFFFFF';" + "newDiv.style.border = '0px';" + "newDiv.style.overflow = overflowAssignment;" + "newDiv.style.zIndex = '-1';" + "newDiv.style.display = 'none';" + "bodyID.appendChild(newDiv);" + "}" + "}" + "}";
2、调用代码
为Iframe添加mouseover事件 Application和Panel两个地方设置为backGroundAlpha为0,也就是设置为透明,关键代码在,Flex调用js的方法中,也就是在鼠标移至Iframe上时,让其zIndex显示为1,这是iframe显示出来之后在用js给当前的div也就是显示出来的Ifram加上事件,当鼠标离开时zIndex设置为-1,我这里没有在Flex的Iframe中设置鼠标离开事件,而是放到js中,那是因为显示出来的div层与Flex的Iframe是一个互斥事件,如果设置了之后,鼠标在Iframe的区域移动,那么鼠标离开事件与鼠标放上去的事件会不断交替执行,性能和感知都会很差。document.getElementById('ifm0')这个ifm0就是你当前页flex的Ifram的Id,在google的源代码中会给这个Id加上一个序列
也就是一个编号,也就变成ifm0了,具体大家看源代码,这个ifm0也就是显示出来的iframe的div的ID
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application backgroundAlpha="0" layout="vertical" xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:flexiframe="com.google.code.flexiframe.*">
- <mx:Script>
- <![CDATA[
- import mx.controls.Alert;
- import mx.managers.PopUpManager;
- private function showWin():void{
- Alert.show("TestWin");
- }
- private function mOver(e:MouseEvent):void{
- ExternalInterface.call("function mover(){document.getElementById('ifm0').style.zIndex=\"1\";document.getElementById('ifm0').οnmοuseοut=function (){document.getElementById('ifm0').style.zIndex=\"-1\";}}");
- }
- ]]>
- </mx:Script>
- <mx:Style source="style/flex_skins.css" />
- <mx:Button label="test" click="showWin();"/>
- <mx:Panel title="iframe" backgroundAlpha="0" id="pl" width="100%" height="200">
- <flexiframe:IFrame mouseOver="mOver(event)" cachePolicy="off" source="/FlexIframeInWeb/WebContent/a.html" id="ifm" width="100%" height="100%"/>
- </mx:Panel>
- </mx:Application>
<?xml version="1.0" encoding="utf-8"?> <mx:Application backgroundAlpha="0" layout="vertical" xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:flexiframe="com.google.code.flexiframe.*"> <mx:Script> <![CDATA[ import mx.controls.Alert; import mx.managers.PopUpManager; private function showWin():void{ Alert.show("TestWin"); } private function mOver(e:MouseEvent):void{ ExternalInterface.call("function mover(){document.getElementById('ifm0').style.zIndex=\"1\";document.getElementById('ifm0').οnmοuseοut=function (){document.getElementById('ifm0').style.zIndex=\"-1\";}}"); } ]]> </mx:Script> <mx:Style source="style/flex_skins.css" /> <mx:Button label="test" click="showWin();"/> <mx:Panel title="iframe" backgroundAlpha="0" id="pl" width="100%" height="200"> <flexiframe:IFrame mouseOver="mOver(event)" cachePolicy="off" source="/FlexIframeInWeb/WebContent/a.html" id="ifm" width="100%" height="100%"/> </mx:Panel> </mx:Application>
至此困扰了我很久的问题解决了,附上截图,如果有更好的方法,欢迎大家留言交流,由于我使用的是web项目与Flex相结合里面有很多多余的包(大于10M了),上传不上去,如果有需要源代码的请留下邮箱,我会发给大家。