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

Я пытался получить доступ к 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));

}

Очень давно пытаюсь, кто-нибудь знает, как это исправить? Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
19 759
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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


Я использую 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.

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

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

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

  • IE 9,8,7
  • Firefox 6.0.1
  • Netscape Navigator 9.0.0.6
  • Opera 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];
    }
}

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