2012-07-12 32 views
0

讓我現在解釋一下我目前的問題:的Flex的navigateToUrl從iframe的POST

我有位於域A web應用程序我們稱之爲A-應用。我從A-App打開一個指向域B上的Flex應用程序的iframe。我們將其稱爲B-FlexApp。 B-FlexApp想要將一些數據發佈到位於同一個域中的另一個應用程序,我們將其稱爲B-App。問題是,在IE中,B-FlexApp和B-App之間的通信中斷,而B-FlexApp在iframe中打開。這隻發生在IE中。

但是,當在新窗口中打開B-FlexApp時,將數據發佈到B-App中工作得很好。如何克服這一點?刪除iframe是不可能的。

回答

0

我發現我可以使用swfObject來嵌入Flash對象,因此iframe的實現是完全無用的。將Flash組件嵌入到疊加層中,而不是在iframe中打開它,這會使IE的行爲正常。

+0

我認爲你使用的是swf地址,因爲它是嵌入flash的標準方式。 – Drala 2012-07-15 11:30:33

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

希望它能幫助!

+0

但是,您將如何使用該修復從FLEX內部發送數據? – user253530 2012-07-13 17:08:23

+0

我沒有看到你想發佈數據...你可以做的是寫你自己的JS函數,並將其稱爲傳遞參數,如: flash.external.ExternalInterface.call(「myFunction」,「myArgument」); 而在JS方面,您將擁有以下內容: 函數myFunction(參數) { // doSomethingWithArgument; window.open(「someAddress」); } – Drala 2012-07-13 20:06:38

+0

謝謝你的幫助,但我發現使用swfobject嵌入flash對象可以幫助我刪除iframe實現,因此IE將會正常工作。 – user253530 2012-07-15 11:21:03

0

最好讓瀏覽器實際上執行「導航到URL」功能而不是Flex。

例如,在包含Flex應用程序的頁面中,該頁面將包含一個JavaScript函數調用handleNavigationRequest(pageName,target)。在Flex應用程序中,您可以使用ExternalInterface,並調用handleNavigationRequest。

通過使用這個範例,Flex應用程序將不必詳細瞭解外部實現(如框架設置等)以及您最終得到更乾淨且耦合度更低的設計。

0

我有同樣的問題,我解決了它只是傳遞第二個參數(瀏覽器窗口)的功能: navigateToUrl(url,"_blank");,在我的情況下,我使用"_blank"

它適用於IE8和IE9。

Davide