2010-01-20 31 views
0

我有一個簡單的HTML文檔與flex應用程序和iframe並排(使用1x2表)。如何將Flex的ExternalInterface與IFrame一起使用?

Flex應用程序中有一個按鈕,單擊它時,通過使用ExnternalInterface.call方法調用JavaScript函數「doNavClick(url)」,將iframe的「src」屬性設置爲URL。

或者這就是主意。

當我註釋掉html中的iframe對象聲明時,對doNavClick的調用有效(我彈出警告來測試)....但是當iframe聲明存在時,它甚至不會收到呼叫。就好像iframe已經打破了調用調度機制。

有沒有這方面的工作?

有問題的代碼如下:包含swf應用

--- Main.mxml

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
       paddingLeft="0" paddingRight="0" 
       paddingTop="0" paddingBottom="0" 
> 

    <mx:Script> 
    <![CDATA[ 

     import flash.events.MouseEvent; 

     private function doNavClick(event:MouseEvent):void 
     { 
     if (ExternalInterface.available) 
     { 
      var url:String = "http://www.google.com" 
      ExternalInterface.call("doNavClick", url); // Problematic with iframes 
     } 
     else 
     { 
      mx.controls.Alert.show("External interface not available"); 
     } 
     } 

    ]]> 
    </mx:Script> 

    <mx:VBox width="100%" height="100%"> 
    <mx:Button label="Google" click="doNavClick(event)"/> 
    </mx:VBox> 

</mx:Application> 

...和HTML/JavaScript代碼:

- - index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
    <head> 
     <title>My SWF Project</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
     <script type="text/javascript" src="swfobject.js"></script> 
     <script type="text/javascript"> 
      swfobject.registerObject("mySWFProj", "9.0.0"); 
     </script> 
    <style> 
     html, body, div { height: 99%; } 
    </style> 
    </head> 
    <body> 
    <table border="1" width="100%" height="100%"> 
     <tbody> 
     <tr> 
      <td style="width: 25%; height: 100%"> 
      <div style="width: 100%; height: 100%"> 
       <object id="mySWFProj" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"> 
       <param name="allowscriptaccess" value="always" /> 
       <param name="allowfullscreen" value="true" /> 
       <!--[if !IE]>--> 
       <object type="application/x-shockwave-flash" data="mySWFProj.swf" width="100%" height="100%"> 
        <param name="allowscriptaccess" value="always" /> 
        <param name="allowfullscreen" value="true" /> 
       <!--<![endif]--> 
        <a href="http://www.adobe.com/go/getflashplayer"> 
        <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /> 
        </a> 
       <!--[if !IE]>--> 
       </object> 
       <!--<![endif]--> 
       </object> 
      </div> 
      </td> 
      <td style="width: 75%; height: 100%"> 
      <div style="width: 100%; height: 100%"> 
       <!-- <iframe id="htmlFrame" width="100%" height="100%" src="http://www.amazon.com"> --> 
      </div> 
      </td> 
     </tr> 
     </tbody> 
    </table> 

     <script type="text/javascript"> 

     function doNavClick(url) 
     { 
     alert(url); 
     //document.getElementById('htmlFrame').src = url; 
     } 
     </script> 
    </body> 
</html> 

此代碼只會彈出一個瀏覽器提示,其中包含谷歌網址。如果取消註釋iframe聲明(id爲「htmlFrame」)並重新加載頁面,則警告不會顯示,事實上,JavaScript doNavClick(url)永遠不會被調用。

更新:有趣....當我檢查index.html的DOM(我用這個螢火蟲)身體通常有兩個子節點 - 表&腳本。當iframe聲明存在時,腳本子消失......這解釋了爲什麼我的ExternalInterface.call永遠不會去任何地方。爲什麼包含iframe會導致我的腳本對象被刪除?

UPDATE2:將doNavScript(url)腳本移動到文檔的「頭部」可修復此問題。就好像iframe聲明阻止任何其他孩子成爲身體的一部分......我並不是說這就是實際發生的事情,只是這似乎是症狀。

+0

不知您DoNavClick ()函數看起來像什麼? – DoctorLouie 2010-01-20 23:36:52

+0

我們需要看一些代碼。我們需要看看你是如何調用這個函數的,以及頁面代碼是什麼樣子的,以及javascript函數的樣子是什麼 – 2010-01-21 00:02:12

+0

非常正確......代碼示例添加了:) – Dan 2010-01-21 15:57:43

回答

1

將javascript代碼放置在html文檔的<head>部分。

如果有人願意提供比這個更全面的答案/解釋,我會高興地授予其爲「公認的」 ......這感覺不對某種程度上接受我自己的答案;)

+0

如果這是正確的答案,儘管我可能會拒絕接受幾天,看是否有人解釋爲什麼iframe似乎阻止腳本標記顯示,除非它在頭標記中。詢問頭腦想知道。 – invertedSpear 2010-01-21 20:30:37

+0

只是似乎有點自負接受我自己的答案;) 我不知道是否有接受答案的時間限制(如有賞金),但我想打開它,讓我或另一個,可以確定地回答這個問題。我所提供的是一個成功的解決方法,而不是解釋:) – Dan 2010-01-25 14:59:23

相關問題