Как использовать внешний интерфейс Flex с IFrames?

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

В приложении 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), тело обычно имеет два дочерних узла - table и script. Когда присутствует объявление iframe, дочерний скрипт исчезает ... что объясняет, почему мой ExternalInterface.call никогда никуда не уходит. Почему включение iframe приводит к удалению моего объекта скрипта?

ОБНОВЛЕНИЕ 2. Перемещение скрипта doNavScript (url) в «заголовок» документа решает эту проблему. Это как если бы объявление iframe не позволяло другим детям быть частью тела ... Я не говорю, что это то, что на самом деле происходит, только то, что это кажется симптомом.


person Dan    schedule 20.01.2010    source источник
comment
Как выглядит ваша функция DoNavClick ()?   -  person DoctorLouie    schedule 21.01.2010
comment
Нам нужен код. Нам нужно увидеть, как вы вызываете функцию, как выглядит код страницы и как выглядит функция javascript.   -  person Gabriel McAdams    schedule 21.01.2010
comment
Совершенно верно ... добавлен пример кода :)   -  person Dan    schedule 21.01.2010


Ответы (1)


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

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

person Dan    schedule 21.01.2010
comment
Не должно быть ничего плохого, если это правильный ответ, хотя я мог бы отложить принятие в течение нескольких дней, чтобы увидеть, придет ли кто-нибудь объяснение, почему iframe, похоже, не позволяет тегу script отображаться, если он не находится в теге head. Пытливые умы хотят знать. - person invertedSpear; 21.01.2010
comment
Мне показалось, что я немного тщеславен, чтобы принять свой ответ;) Я не знаю, есть ли ограничение по времени на принятие ответа (например, о наградах), но я бы хотел оставить его открытым, чтобы я или кто-то другой мог окончательно ответить на это. Все, что я предоставил, - это успешный обходной путь, а не объяснение :) - person Dan; 25.01.2010