【问题标题】:Flex navigateToURL from iframe POST来自 iframe POST 的 Flex navigateToURL
【发布时间】:2012-07-12 14:38:10
【问题描述】:

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

我有一个位于域 A 的 webapp。我们称之为 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。

【问题讨论】:

    标签: apache-flex internet-explorer iframe cross-domain


    【解决方案1】:

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

    希望对你有帮助!

    【讨论】:

    • 但是您将如何使用该修复从 FLEX 中发布数据?
    • 我没有看到你想发布数据......你可以做的是编写自己的 JS 函数并调用它传递参数,如:flash.external.ExternalInterface.call("myFunction", "我的参数");在 JS 方面,您将拥有以下内容: function myFunction(argument) { //doSomethingWithArgument; window.open("someAddress"); }
    • 感谢您的帮助,但我发现使用 swfobject 嵌入 Flash 对象有助于我放弃 iframe 实现,因此 IE 将正常运行。
    【解决方案2】:

    最好让浏览器真正做“导航到 URL”功能,而不是 Flex。

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

    通过使用这种范式,Flex 应用程序不必考虑外部实现(如框架设置等)的细节,最终您将获得更简洁且耦合更少的设计。

    【讨论】:

      【解决方案3】:

      我发现我可以使用 swfObject 来嵌入 flash 对象,因此 iframe 实现完全没用。将 flash 组件嵌入覆盖中,而不是在 iframe 中打开它,可以使 IE 正常运行。

      【讨论】:

      • 我假设您使用的是 swf 地址,因为它是嵌入闪存的标准方式。
      【解决方案4】:

      我遇到了同样的问题,我只需将第二个参数(浏览器窗口)传递给函数就解决了: navigateToUrl(url,"_blank"); ,就我而言,我使用 "_blank"

      它适用于 IE8 和 IE9。

      大卫

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-28
        • 2010-10-29
        • 1970-01-01
        • 2013-01-07
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多