![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
Всем привет.
Пытаюсь из страницы вызвать функцию во флеше но мой код работает только в мозиле (не работает в хроме! и опере), что локально что на хостинге, ругаются что нет такой функции у объекта 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,113
Записей в блоге: 1
|
Ralph_DiMarko, выложите пример в архивчике, потестируем.
AlexCooper, я в упор не понимаю смысла вашего "шаманства" с EI и js. И вот это не понимаю: Объясните, что это, зачем, и как работает, пожалуйста.
__________________
hauts.ru |
|
|||||
|
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
Да, мне тоже, потом загуглил и увидел что все таки без ь, но меня унесло течением гугла...
Прикрепил архив. После загрузки страницы вызывается метод process во флеше, в методе флеш вызывает скрипт callFromFlash и в консоле страницы должно появится "callFromFlash" |
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 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, время: 02:09. |
|
|
« Предыдущая тема | Следующая тема » |
|
|