从iframe POST Flex导航ToURL

时间:2012-07-12 18:56:01

标签: flex internet-explorer iframe cross-domain

让我现在解释一下我目前的问题:

我有一个位于域A的网络应用程序。我们称之为A-App。我从A-App打开一个指向域B上的Flex应用程序的iframe。我们称之为B-FlexApp。 B-FlexApp想要将一些数据发布到位于同一域的另一个应用程序,我们称之为B-App。问题是在IE中,当在iframe中打开B-FlexApp时,通信在B-FlexApp和B-App之间中断。这只发生在IE中。

但是,在新窗口中打开B-FlexApp时,将数据发布到B-App工作正常。怎么克服这个?删除iframe是不可能的。

4 个答案:

答案 0 :(得分:0)

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);
}

希望它有所帮助!

答案 1 :(得分:0)

最好让浏览器实际执行“导航到URL”功能而不是Flex。

例如,在包含Flex应用程序的页面中,该页面将包含一个Javascript函数调用handleNavigationRequest(pageName,target)。在Flex应用程序中,您可以使用ExternalInterface,并调用handleNavigationRequest。

通过使用这个范例,Flex应用程序不必详细说明外部实现(如框架设置等)的详细信息,并且最终会得到更清晰,更少耦合的设计。

答案 2 :(得分:0)

我发现我可以使用swfObject来嵌入flash对象,因此iframe实现完全没用。将Flash组件嵌入到叠加层中,而不是在iframe中打开它,使IE表现正常。

答案 3 :(得分:0)

我有同样的问题,我解决了它只是将第二个参数(浏览器窗口)传递给函数:  navigateToUrl(url,"_blank");,在我的情况下,我使用"_blank"

适用于IE8和IE9。

的Davide