Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ExternalInterface работает не во всех браузерах (http://www.flasher.ru/forum/showthread.php?t=194418)

Ralph_DiMarko 13.02.2013 21:15

ExternalInterface работает не во всех браузерах
 
Всем привет.
Пытаюсь из страницы вызвать функцию во флеше но мой код работает только в мозиле (не работает в хроме! и опере), что локально что на хостинге, ругаются что нет такой функции у объекта
Object #<HTMLObjectElement> has no method 'process'

Код AS3:

public function Main():void 
{
        if (ExternalInterface.available)
        {
                Security.allowDomain("*");
                Security.allowInsecureDomain("*");
                ExternalInterface.addCallback("process", process);
        }
}
 
 
public function process():void
{
        MonsterDebugger.log("ping");
        ExternalInterface.call("callFromFlash", "some message will be here");
}

Код:

<head>
        <title>index</title>
        <script type="text/javascript" src="js/swfobject.js"></script>
        <script type="text/javascript">
        var flashvars = {};
        var params = { allowscriptaccess: "always", allowNetworking:"all"};
        var attributes = {id:"flashObject", name:"flashObject"};
        swfobject.embedSWF("Console.swf", "flashContent", "300", "120", "10.0.0", "expressInstall.swf", flashvars,params,attributes);
       
        function callFromFlash(data)
        {
                console.log(data);
        }
       
        </script>
</head>
<body>
        <div id="flashContent">
                <h1>Alternative content</h1>
        </div>
        <script>
                window.onload = function()
                {
                        var o = document.getElementById("flashObject");
                        o.process();
                       
                }
               
        </script>
</body>

swfobject скачал последний, версия плеера везде одинаковая, подскажите пожалуйста что может быть не так?

AlexCooper 13.02.2013 21:27

1. Дождитесь подгрузки всей страницы. Привожу урывки кода
Код:

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script type="text/javascript" src="js/swfobject.js"></script>
  <script type="text/javascript">
        swfobject.registerObject("APPConnector", "10.1.0", "expressInstall.swf");
  </script>
 </head>
 <body onload="pageInit();">
        <script type="text/javascript">

                var jsc = false;

                function APPSender(command,data) {

                        var send = new Object();
                                send.command = command;
                                send.data = data;
                                send.api = '<?php echo $appT ?>';

                    var bridge = Router("APPConnector");

                    if (bridge) bridge.take(send);
                }

                function Router(name) {
                        return swfobject.getObjectById(name);
                }

                function jsready() { return jsc; }

                function pageInit() { jsc = true; }

        </script>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="807" height="785" id="APPConnector">
                        <param name="movie" value=<?php echo $SWFCORE; ?> />
                        <param name="wmode" value="opaque" />
                                <!--[if !IE]>-->
                                <object type="application/x-shockwave-flash" data=<?php echo $SWFCORE; ?> width="807" height="785" name="APPConnector">
                                <param name="wmode" value="opaque" />
                                <!--<![endif]-->
                                        <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>
                                <!--[if !IE]>-->
                                </object>
                                <!--<![endif]-->
        </object>


Код AS3:

package  {
 
        import flash.utils.Timer;
        import flash.utils.setTimeout;
        import flash.events.TimerEvent;
 
        import flash.external.ExternalInterface;
 
        public class External extends dispatchEvent {
 
                public const SystemName:String = "EXTERNAL";
 
                private var reconnect:uint = 5;
                private var attempts:uint = 15;
 
                private var isSupported:Boolean = false;
 
                public function External() {
                }
 
                public function init():void {
                        if (ExternalInterface.available) {
                try {
 
 
                    if (checkJSReady()) {
                                                trace("JavaScript is ready.");
                    } else {
                                                trace("JavaScript is not ready, creating timer.");
 
                        var JSConnector:Timer = new Timer(100, 0);
                                                        JSConnector.addEventListener(TimerEvent.TIMER, timerHandler);
                                                        JSConnector.start();
                    }
                } catch (error:SecurityError) {
 
                                        trace("A SecurityError occurred: " + error.message);
                } catch (error:Error) {
                                        trace("An Error occurred: " + error.message);
                }
            } else {
                                trace("External interface is not available for this container.");
            }
 
 
 
                        if (!ExternalInterface.call("window.location.href.toString")) {
                                trace('IDE MODE');
                        } else isSupported = true;
 
                }
 
                public function addCallBack(func:String,callback:Function):void {
                        ExternalInterface.addCallback(func, callback);
                }
 
                public function call(func:String,... args):Object {
                        return ExternalInterface.call(func,args);
                }
 
                private function checkJSReady():Boolean {
            var isReady:Boolean = ExternalInterface.call("jsready");
 
                        if (isReady)
                                trace('JS READY');
 
            return isReady;
        }
 
                private function timerHandler(event:TimerEvent):void {
 
                        if (isSupported) {
                                trace("Checking JavaScript status...");
 
                                var isReady:Boolean = checkJSReady();
                                if (isReady) {
                                        trace("JavaScript is ready.");
                                        Timer(event.target).stop();
                                }
                        } else {
                                trace("Emulation: JavaScript.");
                                Timer(event.target).stop();
                        }
        }
        }
}

Код AS3:

package {
        import External;
        public class MultiAPIConnector extends dispatchEvent {
 
                private var ex:External = new External();
 
                public function MultiAPIConnector() {
                        ex.init();
 
                        // call AS3->JS
                        var getData = ex.call('JSFunction'); // не сработает если JS не готов, проследите за готовностью
                        // call JS->AS3
                        ex.addCallBack('take',JSEventHandler);
                };
                private function JSEventHandler($data:*):void {
                        // some your code
                }
}


Ralph_DiMarko 13.02.2013 22:45

Спасибо за класс, пригодиться.
Забыл сказать что уже пытался дергать флеш и после полной загрузки страницы путем клика по кнопке на странице, но результат тот же.
типа такого
Код:

<script>
function testFlash()
{
        var o = document.getElementById("flashObject");
        var pingResult = o.process('{"cm":"ping"}');
        console.log(pingResult);
}
</script>
<a href="#" onclick="testFlash()" >ping flash</a>


ZicoRio 13.02.2013 23:06

Попробуйте учесть регистр

allowScriptAccess

Ralph_DiMarko 13.02.2013 23:30

Цитата:

Сообщение от ZicoRio (Сообщение 1120570)
Попробуйте учесть регистр

allowScriptAccess

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

dimarik 13.02.2013 23:58

Цитата:

Сообщение от Ralph_DiMarko (Сообщение 1120565)
Спасибо за класс, пригодиться.

Стыдно мне за ваш русский. Это ться не скомпилируется.

ZicoRio 14.02.2013 11:40

Попробуйте отключить у Chrome PPAPI FlashPlayer, оставив только NPAPI.
Хотя у меня ExternalInterface работает и при включенном PPAPI, но кто его знает.
Я не использую swfobject, хотя она и не хитрая совсем, но все надо тестировать.
Попробуйте обойтись без этой библиотеки, а расположить код <object> прямо в HTML коде.

Hauts 14.02.2013 13:36

Ralph_DiMarko, выложите пример в архивчике, потестируем.

AlexCooper, я в упор не понимаю смысла вашего "шаманства" с EI и js.

И вот это не понимаю:
Код AS3:

public class External extends dispatchEvent {

Объясните, что это, зачем, и как работает, пожалуйста.

Ralph_DiMarko 15.02.2013 02:31

Вложений: 1
Цитата:

Сообщение от dimarik (Сообщение 1120583)
Стыдно мне за ваш русский. Это ться не скомпилируется.

Да, мне тоже, потом загуглил и увидел что все таки без ь, но меня унесло течением гугла...

Цитата:

Сообщение от Hauts (Сообщение 1120648)
Ralph_DiMarko, выложите пример в архивчике, потестируем.

Прикрепил архив.
После загрузки страницы вызывается метод process во флеше, в методе флеш вызывает скрипт callFromFlash и в консоле страницы должно появится "callFromFlash"

Hauts 15.02.2013 10:56

Ralph_DiMarko, window.onload срабатывает до того, как загрузится флэшка.

http://hauts.ru/tmp/index.html - это ваш вариант. Возникает ошибка "Uncaught TypeError: Object #<HTMLObjectElement> has no method 'process'"

http://hauts.ru/tmp/index_2.html - мой вариант, вроде работает. Код флэшки (as3 project with preloader):
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.external.ExternalInterface;
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;
        import flash.text.TextFormat;
 
        /**
        * ...
        * @author Hauts (Michael Chistyakov) http://hauts.ru/
        */

        [Frame(factoryClass="Preloader")]
 
        public class Main extends Sprite {
                private var _txt:TextField;
 
                public function Main():void {
                        if (stage)
                                init();
                        else
                                addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        _txt = new TextField()
                        addChild(_txt)
 
                        _txt.autoSize = TextFieldAutoSize.LEFT
                        _txt.textColor = 0xFF0000
                        _txt.x = _txt.y = 10
                        _txt.defaultTextFormat = new TextFormat("Tahoma", 11)
 
                        if (ExternalInterface.available) {
                                ExternalInterface.addCallback("process", process)
                                _txt.text = "ExternalInterface.addCallback(\"process\", process)";
                        } else {
                                _txt.text = "ExternalInterface.available = false"
                        }
                }
 
                private function process():void {
                        _txt.text = "Call process"
                        ExternalInterface.call("callFromFlash")
                }
        }
}

Возможно ошибка связана с тем, что флэшка не успевает прогрузиться. Попробуйте поставить прелодер.


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

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