as3 ExternalInterface.addCallback не работает правильно - PullRequest
4 голосов
/ 19 ноября 2008

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

Однако по какой-то причине он работает неправильно. Проблема, с которой я сталкиваюсь является то, что он не работает в 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 ]

8 голосов
/ 21 ноября 2008

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

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

1 голос
/ 06 сентября 2011

Используйте этот код, чтобы получить объект 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];
    }
}
0 голосов
/ 03 марта 2009

Краткое описание успеха:


Я использую 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 мс, но результаты были пятнистыми. С 1000мс это работало в IE, FF и Safari на ПК. Не проверял на Mac OS X.

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

...