PDA

Просмотр полной версии : AS 3 + JS ( ExternalInterface.addCallback )


Gigatrop
23.10.2011, 18:18
Здравствуйте.
Бьюсь над проблемой вызова функций из JS, но ничего не работает. Файрфокс ничего не говорит, а ИЕ ругается "объект не поддерживает свойство или метод".

HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>File Uploader - adylevy.com</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" />
<script type="text/javascript" src="js/swfobject.js"></script>
<script type="text/javascript">
var flashvars = {};
flashvars.path = "";
var params = {};
params.menu = "false";
params.scale = "noscale";
params.salign = "tm";
params.allowScriptAccess = "always";
params.swliveconnect = "true";
var attributes = {};
attributes.align = "middle";

swfobject.embedSWF("swf/imgUpload.swf", "flashHolder", "100%", "100%", "10.0.0", false, flashvars, params, attributes, swfEmbeded);

function swfEmbeded(e){
if(e.success){
mySWF = document.getElementById('flashHolder');
mySWF.swfSelFile('a');
}
}

</script>
</head>
<body style='background-color:#123456;margin:0px;padding:0px;'>
<div id='mainHolder' style='position:absolute;width:100%;height:100%;'>
<div id="flashHolder">
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
</a>
</div>
</div>
</body>
</html>


AS3:

flash.external.ExternalInterface.addCallback( "swfSelFile", swfSelFile );
function swfSelFile( msg ) {
this.root.scaleX = 2;
}

andrew911
23.10.2011, 18:44
RTFM (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html)

function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
}
function sendToActionScript(value) {
thisMovie("ExternalInterfaceExample").sendToActionScript(value);
}

fljot
23.10.2011, 18:48
1.mySWF = document.getElementById('flashHolder'); может быть недостаточно. Посмотрите, как нужно получать ссылку на объект во флешевой документации (см. класс ExternalInterface) см. выше

2. В момент вызова mySWF.swfSelFile('a'); флеш скорее всего ещё не успел подписаться (ExternalInterface.addCallback)

ProxyGreen
23.10.2011, 18:48
Ну вы вызываете функцию swfSelFile() у mySWF, который является "ссылкой" на контейнер flashHolder в котором непонятно что вообще находится. Нужно у объекта swf-ки вызывать зарегистрированную функцию, нэ?

Gigatrop
23.10.2011, 19:16
andrew911, в вашем куске из документации есть movieName, это то же самое что ID ?

ProxyGreen, flash.external.ExternalInterface.addCallback( "swfSelFile", swfSelFile ); - это и регистрирует функцию-мост между JS и AS.
А контейнер flashHolder заменяется на мувик с таким же ID - выше в JS написан embedSWF, который это делает.

fljot, вызов достаточен, проверял через mySWF.width = '100';
Насчет "не успевает" - врятли, таймаут на 10 сек ставил.

fljot
23.10.2011, 20:00
А контейнер flashHolder заменяется на мувик с таким же ID - выше в JS написан embedSWF, который это делает.
Вот это врятли. Надо явно указать attributes.id = "flashHolder";

Gigatrop
23.10.2011, 20:23
Файрбаг показывает что вместо контейнера становится объект с id, и явное указание бесполезно.

Добавлено через 8 минут
Это то что показывает флеш плеер (дебаг версия):

TypeError: Error #1010: Термин не определен и не имеет свойств.
at MethodInfo-327()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at flash.external::ExternalInterface$/_callIn()
at Function/<anonymous>()

Добавлено через 18 минут
Тема закрыта:
ExternalInterface.addCallback( 'myfun', myfun );
myfun была приватной, а должна быть публичной в классе, это моя ошибка в AS.

Спасибо за участие.

fish_r
23.10.2011, 21:20
Добавлено через 18 минут
Тема закрыта:
ExternalInterface.addCallback( 'myfun', myfun );
myfun была приватной, а должна быть публичной в классе, это моя ошибка в AS.


Ошибка ваша была в том, что вы пытались вызывать метод у.... <div>.
И при чем тут область видимости метода, тогда как он нужен исключительно внутри класса? В данном случае.