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