让我现在解释一下我当前的问题:
我有一个位于域a的网络应用程序。让我们称之为a-App。我从A-App打开一个iframe,它指向域B上的Flex应用程序。我们将称之为B-FlexApp。B-FlexApp想要将一些数据发布到位于同一域的另一个应用程序,我们称之为B-app。问题是,在IE中,当B-FlexApp在iframe中打开时,B-FlexApp和B-App之间的通信中断。这种情况只发生在IE中。
然而,当在新窗口中打开B-FlexApp时,将数据发布到B-App就可以了。如何克服这一点?无法删除iframe。
AS3 navigateToURL和IE有问题。您可以尝试调用javascript进行导航:我有一个小的实用程序类来处理这个问题:
//class URLUtil
package com
{
import flash.external.*;
import flash.net.*;
public class URLUtil extends Object
{
protected static const WINDOW_OPEN_FUNCTION:String="window.open";
public function URLUtil()
{
super();
return;
}
public static function openWindow(arg1:String = "", arg2:String="_blank", arg3:String=""):void
{
var browserName:String = getBrowserName();
switch (browserName)
{
case "Firefox":
{
flash.external.ExternalInterface.call(WINDOW_OPEN_FUNCTION, arg1, arg2, arg3);
break;
}
case "IE":
{
flash.external.ExternalInterface.call("function setWMWindow() {window.open('" + arg1 + "');}");
break;
}
case "Safari":
case "Opera":
{
flash.net.navigateToURL(new URLRequest(arg1), arg2);
break;
}
default:
{
flash.net.navigateToURL(new URLRequest(arg1), arg2);
break;
}
}
return;
}
private static function getBrowserName():String
{
var str:String="";
var browserName:String = ExternalInterface.call("function getBrowser(){return navigator.userAgent;}");
if (!(browserName == null) && browserName.indexOf("Firefox") >= 0)
{
str = "Firefox";
}
else
{
if (!(browserName == null) && browserName.indexOf("Safari") >= 0)
{
str = "Safari";
}
else
{
if (!(browserName == null) && browserName.indexOf("MSIE") >= 0)
{
str = "IE";
}
else
{
if (!(browserName == null) && browserName.indexOf("Opera") >= 0)
{
str = "Opera";
}
else
{
str = "Undefined";
}
}
}
}
trace("Browser: t" + str);
return str;
}
}
}
你这样称呼它:
btn.addEventListener(MouseEvent.CLICK, onBTNClick);
function onBTNClick(evt:MouseEvent):void
{
URLUtil.openWindow(YOUR_URL_STRING);
}
希望它能有所帮助!
最好让浏览器实际执行"导航到URL"功能,而不是Flex。
例如,在包含Flex应用程序的页面中,该页面将包含一个Javascript函数调用handleNavigationRequest(pageName,target)。在Flex应用程序中,您可以使用ExternalInterface,并调用handleNavigationRequest。
通过使用这种范式,Flex应用程序将不必了解外部实现(如框架设置等)的细节,最终将获得更干净、耦合更少的设计。
我发现我可以使用swfObject来嵌入flash对象,因此iframe实现完全无用。将flash组件嵌入覆盖中,而不是在iframe中打开它,可以使IE正常工作。
我遇到了同样的问题,我只需将第二个参数(浏览器窗口)传递给函数即可解决:navigateToUrl(url,"_blank");
,在我的情况下,我使用"_blank"
。
它适用于IE8和IE9。
Davide