Проблемы с извлечением переменной из Flash с JavaScript в IE8 - PullRequest
1 голос
/ 02 марта 2010

Я создаю тест, и в качестве таймера в тесте у меня есть флэш-фильм (анимированные часы). Я опрашиваю часы каждую секунду, чтобы узнать, не истекло ли время для викторины.

Код для этой функции выглядит следующим образом: (упрощенно)

$(window).load(function() {
    var flashMovie = getFlashMovieObject(flashId);
    var timeElapsed = flashMovie.GetVariable("timeElapsed");
    var timeSet = flashMovie.GetVariable("countdown");
    var degrees = flashMovie.GetVariable("degrees");
    var timerStatus = flashMovie.GetVariable("timerStatus");
});

Прежде всего, он просто выбирает объект flash-ролика, а затем вызывает некоторые методы для объекта. Это прекрасно работает в Firefox (pc & mac), Safari (mac), но в IE8 на ПК он возвращает «неожиданную ошибку в строке 3» (или любую другую строку, которая использует объект flashMovie).

Код для функции getFlashMovieObject () выглядит следующим образом:

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

    return document[movieName];
}

Любая помощь приветствуется!

ОБНОВЛЕНИЕ: Я выяснил, что если установить IE8 очистить кэш для каждой перезагрузки, то это происходит. Если я этого не сделаю, то произойдет сбой только в первый раз, и все последующие перезагрузки будут работать нормально. Я не понимаю, как кеш может решить эту проблему.

Ответы [ 2 ]

1 голос
/ 02 марта 2010

По моему опыту, функция getFlashMovieObject имеет некоторые причуды в некоторых браузерах, и я нашел несколько ее версий. В большинстве браузеров это выглядит довольно неплохо:

function getFlashMovieObject(movieName){
  if(document.embeds[movieName])
    return document.embeds[movieName];
  if(window.document[movieName])
    return window.document[movieName];
  if(window[movieName])
    return window[movieName];
  if(document[movieName])
    return document[movieName];
  return null;
}

Если вы используете jQuery, я обнаружил, что это так просто, как

$("#flashobject")[0].GetVariable("timeElapsed");

, кажется, работает на каждом браузере.

0 голосов
/ 18 июля 2011

По дикой догадке, IE неправильно запускает событие window.load слишком рано, до того, как ваш swf будет полностью загружен. Это может объяснить, почему очистка вашего кэша приводит к ошибке.

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

...