Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.02.2013, 21:15
Ralph_DiMarko вне форума Посмотреть профиль Отправить личное сообщение для Ralph_DiMarko Найти все сообщения от Ralph_DiMarko
  № 1  
Ответить с цитированием
Ralph_DiMarko
 
Аватар для Ralph_DiMarko

Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
По умолчанию 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 скачал последний, версия плеера везде одинаковая, подскажите пожалуйста что может быть не так?

Старый 13.02.2013, 21:27
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 2  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
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
		}
}
__________________
return this...

Старый 13.02.2013, 22:45
Ralph_DiMarko вне форума Посмотреть профиль Отправить личное сообщение для Ralph_DiMarko Найти все сообщения от Ralph_DiMarko
  № 3  
Ответить с цитированием
Ralph_DiMarko
 
Аватар для Ralph_DiMarko

Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
Спасибо за класс, пригодиться.
Забыл сказать что уже пытался дергать флеш и после полной загрузки страницы путем клика по кнопке на странице, но результат тот же.
типа такого
Код:
<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>

Старый 13.02.2013, 23:06
ZicoRio вне форума Посмотреть профиль Отправить личное сообщение для ZicoRio Найти все сообщения от ZicoRio
  № 4  
Ответить с цитированием
ZicoRio
[+5 18.06.13]
[+1 20.07.13]

Регистрация: Apr 2012
Адрес: ifinterface.com
Сообщений: 158
Попробуйте учесть регистр

allowScriptAccess

Старый 13.02.2013, 23:30
Ralph_DiMarko вне форума Посмотреть профиль Отправить личное сообщение для Ralph_DiMarko Найти все сообщения от Ralph_DiMarko
  № 5  
Ответить с цитированием
Ralph_DiMarko
 
Аватар для Ralph_DiMarko

Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
Цитата:
Сообщение от ZicoRio Посмотреть сообщение
Попробуйте учесть регистр

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

Старый 13.02.2013, 23:58
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 6  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Ralph_DiMarko Посмотреть сообщение
Спасибо за класс, пригодиться.
Стыдно мне за ваш русский. Это ться не скомпилируется.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 14.02.2013, 11:40
ZicoRio вне форума Посмотреть профиль Отправить личное сообщение для ZicoRio Найти все сообщения от ZicoRio
  № 7  
Ответить с цитированием
ZicoRio
[+5 18.06.13]
[+1 20.07.13]

Регистрация: Apr 2012
Адрес: ifinterface.com
Сообщений: 158
Попробуйте отключить у Chrome PPAPI FlashPlayer, оставив только NPAPI.
Хотя у меня ExternalInterface работает и при включенном PPAPI, но кто его знает.
Я не использую swfobject, хотя она и не хитрая совсем, но все надо тестировать.
Попробуйте обойтись без этой библиотеки, а расположить код <object> прямо в HTML коде.

Старый 14.02.2013, 13:36
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 8  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Ralph_DiMarko, выложите пример в архивчике, потестируем.

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

И вот это не понимаю:
Код AS3:
public class External extends dispatchEvent {
Объясните, что это, зачем, и как работает, пожалуйста.
__________________
hauts.ru

Старый 15.02.2013, 02:31
Ralph_DiMarko вне форума Посмотреть профиль Отправить личное сообщение для Ralph_DiMarko Найти все сообщения от Ralph_DiMarko
  № 9  
Ответить с цитированием
Ralph_DiMarko
 
Аватар для Ralph_DiMarko

Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
Цитата:
Сообщение от dimarik Посмотреть сообщение
Стыдно мне за ваш русский. Это ться не скомпилируется.
Да, мне тоже, потом загуглил и увидел что все таки без ь, но меня унесло течением гугла...

Цитата:
Сообщение от Hauts Посмотреть сообщение
Ralph_DiMarko, выложите пример в архивчике, потестируем.
Прикрепил архив.
После загрузки страницы вызывается метод process во флеше, в методе флеш вызывает скрипт callFromFlash и в консоле страницы должно появится "callFromFlash"
Вложения
Тип файла: rar test.rar (36.2 Кб, 31 просмотров)

Старый 15.02.2013, 10:56
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 10  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
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")
		}
	}
}
Возможно ошибка связана с тем, что флэшка не успевает прогрузиться. Попробуйте поставить прелодер.
__________________
hauts.ru

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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