as3 ExternalInterface.addCallback не работает правильно

Я пытался получить доступ к SWF из javascript, поэтому я пытаюсь изменить этот пример в liveocs. http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html

Однако по какой-то причине он работает неправильно. Проблема, с которой я сталкиваюсь, заключается в том, что она не работает в Safari и в Firefox, она работает только в том случае, если я помещаю предупреждение в функцию до того, как javascript передаст значение в swf. (кажется, нужно некоторое время) Я также попытался установить таймер в as3, но таймер не работает, помогает только оповещение в js.

Все, что я хотел сделать, это использовать js, чтобы сообщить файлу swf для воспроизведения ep1.swf. Вот мой код JS:

document.observe('dom:loaded', function() {
    $('episode1').observe('click', function() {
        var params = {wmode : "transparent", allowScriptAccess:"always", movie:"header"};
        swfobject.embedSWF("swf/float.swf", "header", "100%", "100%", "9.0.0","expressInstall.swf", "", params, "");
        sendToActionScript("ep1.swf");
    });
})
function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName];
    } else {
        //alert("aaa")
        return document[movieName];
    }
}
function sendToActionScript(value) {     
    thisMovie('header').sendToActionScript(value);       
}

Вот мой код as3:

private function receivedFromJavaScript(value:String):void {

    loader.load(new URLRequest(value));

}

Я очень долго пытался, кто-нибудь знает, как это исправить? Благодарю.

3 ответа

Решение

Проблема в том, что SWF-файл не полностью загружен к тому времени, когда вы пытаетесь вызвать его. Флэш-плеер, вероятно, загружен, но для загрузки и инициализации SWF-файла требуется некоторое время.

Что вам нужно сделать, это сделать вызов из SWF-файла в функцию javascript, когда он загружен, и поместить туда свой javascript, а не обработчик загрузки страницы, который вы, похоже, делаете сейчас. Таким образом, вы узнаете, что ваше флэш-приложение правильно инициализировано к тому времени. У класса ExternalInterface, который вы используете, есть методы, позволяющие вам перезвонить в javascript.

Используйте этот код, чтобы получить объект SWF.

Я проверил этот код на:

  • IE 9,8,7
  • Firefox 6.0.1
  • Netscape Navigator 9.0.0.6
  • Опера 11,5
  • Google Chrome 13.0.782.215
  • Safari 3.2 (все в ОС Windows)

и это работало нормально.

function GetSWF(strName) {
    if (window.document[strName] != null) {
        if (window.document[strName].length == null)
            return window.document[strName];
        else
            return window.document[strName][1];
    } else {
        if (document[strName].length == null)
            return document[strName];
        else
            return document[strName][1];
    }
}

Резюме успеха:


я использую AC_RunActiveContent.js, как установлено Flash при публикации.
Мой swf называется fvar_js, как видно ниже:

AC_FL_RunContent(
        ...
    'src', 'fvar_js',
        ...

Я подчеркиваю это, потому что я никогда не должен был использовать такую ​​функцию, как thisMovie в посте выше, чтобы указать на объект SWF. Я был в состоянии использовать fvar_js сразу (ну, вроде, как вы увидите).


В моем коде as3 у меня были строки:

if (ExternalInterface.available) {
    ExternalInterface.addCallback("js_to_as_f", js_from_as_f);
}

где js_from_as_f была функция, которая изменяла текст в текстовом поле.


В HTML я настроил следующее:

var timeoutId;
var js_initiate_callback = function() {
    // This is the swf object:
    fvar_js.js_to_as_f();
    clearTimeout ( timeoutId );
}
var reset_fvar_f = function(new_val) {
    fvar_val = new_val;
}
//js_initiate_callback();
timeoutId = setTimeout(js_initiate_callback, 1000);

Я пробовал 1 мс и 100 мс, но результаты были пятнистыми. С 1000ms это работало в IE, FF и Safari на ПК. Не проверял на Mac OS X.

Очевидно, что ключ заключается в том, чтобы все объекты и все соединения объектов были настроены. Я понятия не имею, каково минимальное время.

Другие вопросы по тегам