Flash и JavaScript общение в IE - PullRequest
0 голосов
/ 21 июля 2010

У меня проблемы с передачей строки обратно в SWF с использованием класса EternalInterface во Flash CS4.

У меня есть SWF со следующим кодом:

var externalString:String = ExternalInterface.call("IncomingJS")

, которыйнаходится внутри прослушивателя событий, прикрепленного к Event.ENTERFRAME, и оператора if, ожидающего ExternalInterface.available.

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

function IncomingJS() {
   return stringFromHTML;
}

и располагается на странице HTML с помощью swf.

Я могу успешно получить переменную externalStringи продолжить работу с остальной частью скрипта AS3 в Firefox, Safari и Chrome, но не в IE.

Если я добавлю alert (stringFromHTML) перед оператором возврата в Javascript, я получу значение stringFromHTML спам, который выглядит так, как будто Flash запускает функцию с правильной скоростью.

Код для встраивания в HTML для SWF немного прост:

<object width="750" height="200" id="controlledScale"><param name="movie" value="http://www.myURL.com/controlledScale.swf"><param name="allowScriptAccess" value="sameDomain" /><embed src="http://www.myURL.com/controlledScale.swf" width="750" height="200" allowScriptAccess="sameDomain"></embed></object>

Любая помощь или советс благодарностью.

Спасибо, DavidB

Edit

Я понимаю, насколько плох код SWF для встраивания.К сожалению, HTML-код фактически работает в стороннем генераторе HTML, и одно из его ограничений заключается в том, что я могу иметь только одну строку (с неограниченной длиной) HTML-кода за раз.

Есть и другие варианты(swfObject и т. д.) может работать либо без разрывов строк в коде, либо я бы попросил проблемы с Javascript и SWF, чтобы вместо встраивания SWF напрямую использовать что-то вроде iFrame и ссылаться на «правильную» флэш-памятьHTML-файл delpoyment?

В какой-то момент, когда я даже не уверен, где проблема на самом деле находится.SWF-файлы находят отправку в Javascript во всех браузерах, но не возвращают информацию только в IE.

Ответы [ 3 ]

0 голосов
/ 21 июля 2010

Я почти уверен, что в IE есть «функция» безопасности, которая предотвращает слишком частый вызов JS из Flash, чтобы он не зависал в браузере.

Есть ли причина, по которой вы должны называть это каждый кадр?

Я бы посоветовал против этого любой ценой, так как это создает ОГРОМНУЮ нагрузку на браузер.

***** РЕДАКТИРОВАТЬ *****

Если вы хотите вызвать метод ExternalInterface из JS -> Flash в IE, вы должны ссылаться на объект немного по-другому, например:

function thisMovie(movieName) {
  if (navigator.appName.indexOf("Microsoft") != -1) {
    return window[movieName];
  } else {
    return document[movieName];
  }
}

Затем, если вы уверены, что строка, которую вы хотите передать, построена правильно, вы можете вызвать ее следующим образом из JS:

thisMovie( "theFlashElementID" ).giveMeMyStringAlready();

Тогда в вашей Flash у вас будет что-то вроде этого:

if( ExternalInterface.available ) 
{
  ExternalInterface.addCallback( "giveMeMyStringAlready", handleTheStringFromJS );
}
  else
{
  handleTheFactIDontHaveExternalInterfaceAvailable();
  // the only reason this would be is if container that 
  // is embedding the swf isn't fully loaded by the browser
}

Отличительной чертой документов AS3 относительно ExternalInterface является:

Примечание. При использовании внешнего API с HTML, всегда проверяйте, что HTML имеет закончил загрузку, прежде чем пытаться вызывать любые методы JavaScript.

0 голосов
/ 03 августа 2010

Это:

К сожалению, HTML-код фактически работает в стороннем генераторе HTML

- это проблема.

SWFсидя внутри тега <form>.На этапе браузера существует огромный объем действительно подробного кода, и я пропустил теги в самом начале и конце HTML-кода.

Спасибо за помощь.Если я ничего не узнал из этого опыта, он должен быть полон вопроса и смотреть далеко за пределы непосредственной проблемы, разбивая каждый элемент настолько полно, насколько смогу.

0 голосов
/ 21 июля 2010

Вы должны добавить id к тегу объекта для работы в IE.

<object width="750" id="myflash" height="200"><param name="movie" value="http://www.myURL.com/controlledScale.swf"><param name="allowScriptAccess" value="sameDomain" /><embed src="http://www.myURL.com/controlledScale.swf" width="750" height="200" allowScriptAccess="sameDomain"></embed></object>
...