|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
ExternalInterface работает не во всех браузерах
Всем привет.
Пытаюсь из страницы вызвать функцию во флеше но мой код работает только в мозиле (не работает в хроме! и опере), что локально что на хостинге, ругаются что нет такой функции у объекта Object #<HTMLObjectElement> has no method 'process' 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> |
|
|||||
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> 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(); } } } } 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 } }
__________________
return this... |
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
Спасибо за класс, пригодиться.
Забыл сказать что уже пытался дергать флеш и после полной загрузки страницы путем клика по кнопке на странице, но результат тот же. типа такого |
|
|||||
[+5 18.06.13]
[+1 20.07.13] Регистрация: Apr 2012
Адрес: ifinterface.com
Сообщений: 158
|
Попробуйте учесть регистр
allowScriptAccess
__________________
Небольшая часть реализации моего внутреннего мира |
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
Учел, к сожалению не помогло.
То что флешка есть на странице но к ней нет доступа наводит на какие то мысли, не могу понять какие, ведь в другом браузере то работает. |
|
|||||
[+5 18.06.13]
[+1 20.07.13] Регистрация: Apr 2012
Адрес: ifinterface.com
Сообщений: 158
|
Попробуйте отключить у Chrome PPAPI FlashPlayer, оставив только NPAPI.
Хотя у меня ExternalInterface работает и при включенном PPAPI, но кто его знает. Я не использую swfobject, хотя она и не хитрая совсем, но все надо тестировать. Попробуйте обойтись без этой библиотеки, а расположить код <object> прямо в HTML коде.
__________________
Небольшая часть реализации моего внутреннего мира |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
Ralph_DiMarko, выложите пример в архивчике, потестируем.
AlexCooper, я в упор не понимаю смысла вашего "шаманства" с EI и js. И вот это не понимаю: Объясните, что это, зачем, и как работает, пожалуйста.
__________________
hauts.ru |
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
Да, мне тоже, потом загуглил и увидел что все таки без ь, но меня унесло течением гугла...
Прикрепил архив. После загрузки страницы вызывается метод process во флеше, в методе флеш вызывает скрипт callFromFlash и в консоле страницы должно появится "callFromFlash" |
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
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): 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") } } }
__________________
hauts.ru |
Часовой пояс GMT +4, время: 18:55. |
|
« Предыдущая тема | Следующая тема » |
|
|