ExternalInterface не работает в IE после обновления страницы - PullRequest
4 голосов
/ 26 мая 2011

У меня странная ситуация в IE, когда JS не может вызвать флэш-память с помощью ExternalInterface после нажатия кнопки «обновить».Я знаю, что фильм загружается, и код, который выполняет ExternalInterface.addCallback(), кажется, завершается без каких-либо ошибок

Вот краткое изложение шагов для воспроизведения:

  1. Откройте IE изагрузите фильм в первый раз, методы обратного вызова ExternalInterface доступны для JavaScript.
  2. Если я нажму кнопку обновить, методы обратного вызова недоступны, и я получаю ошибку Object doesn't support this property or method.
  3. Если я очищу кэш и обновлю страницу, они снова будут доступны.
  4. Если я снова нажму «Обновить», не очистив кэш, они будут недоступны.
  5. Если я закрою браузер и снова открою, они снова будут доступны.

Я уже сталкивался с такой ситуацией и уверен, что для загрузки требуется дополнительная задержкаи создание экземпляра swf - это то, что позволяет ExternalInterface быть правильно настроенным.Способ, которым я раньше работал, заключался в добавлении случайного числа в конец URL-адреса swf, чтобы оно никогда не использовалось из кэша, но это не является реальным решением.

Кто-нибудь знает, как решить эту проблему?

edit:

Я должен был также упомянуть, что после обновления, ExternalInterface.available'true', но 'ExternalInterface.objectId' равен 'null'.

Я попытался рандомизировать значение объекта id и встраивать name и идентификатор контейнера div и в каждом случае, ExternalInterface.objectId остается null.


Дополнительная информация:

Я не понимаю, как изменится способ вставки фильма, но я подумал, чтобудет включать в себя код просто чтобы быть уверенным.На мой фильм не влияет проблема «нажмите для активации», и я не хочу использовать SWFObject в этом случае, поскольку флэш-фильм является запасным вариантом в случае, если звук HTML5 недоступен.

var docContainer = document.createElement('div');
docContainer.innerHTML = '<object '
        + 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '
        + 'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" '
        + 'id="mp3player" '
        + 'width="300" '
        + 'height="500">'
    + '<param name="allowScriptAccess" value="always" />'
    + '<param name="movie" value="mp3player.swf" />'
    + '<param name="quality" value="high" />'
    + '<param name="bgcolor" value="#ffffff" />'
    + '<embed ' 
        +'src="mp3player.swf" '
        + 'quality="high" '
        + 'bgcolor="#ffffff" '
        + 'width="300" '
        + 'height="500" '
        + 'swLiveConnect="true" '
        + 'name="mp3player" '
        + 'id="mp3player" '
        + 'allowScriptAccess="always" '
        + 'type="application/x-shockwave-flash" '
        + 'pluginspage="http://www.adobe.com/go/getflashplayer" />'
    + '</object>';
document.body.appendChild(docContainer);

Ответы [ 3 ]

6 голосов
/ 24 февраля 2012

Проблема в том, что класс ExternalInterface перестанет работать после кэширования SWF-файла в вашем браузере.

Чтобы преодолеть это препятствие, вы должны изменить html-файл и swf-файлы следующими способами:Примечание. Это решение было протестировано в IE7

HTML-файл. Добавьте параметры в файл SWF, чтобы сделать его уникальным.Таким образом, браузер будет думать, что вам нужно загружать новый SWF-файл каждый раз, когда загружается страница.

Например, если вы используете библиотеку SWFObject (что вам не нужно), то вы должны сделатьследующие настройки:

var cachecontrol = Math.floor(Math.random()*99999);
var flashvars = {};
var params = {};
var attributes = {id:"movie"};
swfobject.embedSWF("movie.swf?nocache"+cachecontrol, "flashcontent", "100%", "100%", "10.1.0", "expressInstall.swf", flashvars, params, attributes);

Также добавьте следующий метатег, чтобы гарантировать, что ваш HTML-файл не кэшируется:

SWF-файл (ы) - если вы загружаете SWF-файлот главного SWF-файла вам придется применить ту же логику: var cachecontrol: String = Math.floor (Math.random () * 9999) .toString ();loader.load (новый URLRequest ("movie.swf? nocache =" + cachecontrol));

Вот источник решения: http://www.emanuelz.com.mx/blog/cache-control-tips-for-flash-120 Примечание: вам больше не нужно делатьчем то, что описано выше.

6 голосов
/ 12 ноября 2012

В случае, если кому-то интересно, ПОЧЕМУ это происходит, по крайней мере для Internet Explorer кажется, что Flash Player загружен как элемент управления ActiveX, который полностью отделен от модулей DOM и JavaScript. Когда .swf кэшируется, кажется, что элемент управления ActiveX может загрузить и запустить его, прежде чем Javascript будет готов принять события от него.

Это означает, что когда Flash пытается использовать ExternalInterface для добавления обратных вызовов, произойдет сбой, поскольку JavaScript и DOM не были загружены.

Я исправил проблему, дождавшись первого события ENTER_FRAME, а затем зарегистрировав там свои обратные вызовы. Как это:

protected function registerExternalCallbacks(event:Event):void {

    removeEventListener(Event.ENTER_FRAME, registerExternalCallbacks);

    if (ExternalInterface.available) {
        ExternalInterface.addCallback("flash_play", play);
        ExternalInterface.addCallback("flash_setVolume", setVolume);

        ExternalInterface.call("player_ready");
    }
}

// and then when the .swf loads, register the function on the event:
addEventListener(Event.ENTER_FRAME, registerExternalCallbacks);

Это заставит игрока ждать, пока не будут надежно добавлены обратные вызовы, а затем вызывает функцию javascript с именем player_ready, сигнализирующую, что он готов к использованию.

2 голосов
/ 26 мая 2011

Существует множество ошибок IE с ExternalInterface (и флеш-памятью в целом) в разных версиях.Большинство рекомендуемых исправлений предлагают использовать библиотеку SwfObject js, которая исправляет все те, о которых я знаю.http://www.timelesssky.com/blog/internet-explorer-flash-8-externalinterface-bug

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...