Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   AS 3 + JS ( ExternalInterface.addCallback ) (http://www.flasher.ru/forum/showthread.php?t=170377)

Gigatrop 23.10.2011 18:18

AS 3 + JS ( ExternalInterface.addCallback )
 
Здравствуйте.
Бьюсь над проблемой вызова функций из 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:

Код AS3:

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


andrew911 23.10.2011 18:44

RTFM

Код:

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,
Код AS3:

flash.external.ExternalInterface.addCallback( "swfSelFile", swfSelFile );

- это и регистрирует функцию-мост между JS и AS.
А контейнер flashHolder заменяется на мувик с таким же ID - выше в JS написан embedSWF, который это делает.

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

fljot 23.10.2011 20:00

Цитата:

Сообщение от Gigatrop (Сообщение 1041326)
А контейнер 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

Цитата:

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

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


Часовой пояс GMT +4, время: 11:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.