2010-01-20 4 views
0

У меня есть простой html-документ с гибким приложением и iframe бок о бок (с использованием таблицы 1x2).Как использовать внешний интерфейс Flex с IFrames?

В приложении flex есть кнопка, которая при щелчке устанавливает свойство «src» iframe в URL-адрес с помощью метода ExnternalInterface.call для вызова функции javascript «doNavClick (url)».

Или это идея.

Когда я комментирую объявление объекта iframe в html, вызов doNavClick работает (я вывожу предупреждение для тестирования) .... но когда присутствует объявление iframe, оно даже не получает вызов , Это как если бы iframe каким-то образом нарушил механизм диспетчеризации вызовов.

Есть ли это для этого?

Проблемный код выглядит следующим образом:

--- 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 код, содержащий приложение SWF:

- - 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> 

Этот код просто выведет предупреждение обозревателя с помощью URL-адреса google. Если вы раскомментируете объявление iframe (с идентификатором «htmlFrame») и перезагрузите страницу, предупреждение не будет отображаться, на самом деле JavaScript doNavClick (url) никогда не будет вызван.

ОБНОВЛЕНИЕ: Интересно .... когда я изучаю DOM index.html (я использую firebug для этого) тело обычно имеет два дочерних узла - таблицу & скрипт. Когда присутствует объявление iframe, ребенок сценария исчезает ... что объясняет, почему мой ExternalInterface.call никогда не идет нигде. Почему включение iframe приводит к удалению объекта сценария?

UPDATE2: Перемещение сценария doNavScript (url) в «head» документа устраняет эту проблему. Это как если бы объявление iframe препятствовало тому, чтобы другие дети были частью тела ... Я не говорю, что это то, что на самом деле происходит, только то, что это симптом.

+0

Что ваш DoNavClick() выглядит так? – DoctorLouie

+0

Нам нужно увидеть код. Нам нужно посмотреть, как вы вызываете эту функцию, и как выглядит код страницы, и как выглядит функция javascript. –

+0

Совершенно верно ... добавлен код кода :) – Dan

ответ

1

Место javascript-код в разделе <head> html-документа.

Если кто-то хочет, чтобы предложить более полный ответ/объяснение, чем это, я с удовольствием награждаем его как «принято» .... он чувствует себя не так как-то, чтобы принять свой ответ;)

+0

Не следует ошибаться, если это правильный ответ, хотя я мог бы удержаться на нескольких днях, чтобы узнать, появляется ли кто-нибудь объяснение, почему iframe, кажется, мешает появлению тега скрипта, если он не находится в главном теге. Запрошенные умы хотят знать. – invertedSpear

+0

Просто казалось, что я тщеславен, чтобы принять свой собственный ответ;) Я не знаю, есть ли ограничение на принятие ответа (например, на щедрости), но я хотел бы оставить его открытым, чтобы я или другое , может окончательно ответить на этот вопрос.Все, что я предоставил, - это успешное обходное решение, а не объяснение :) – Dan

Смежные вопросы