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

Вернуться   Форум Flasher.ru > Блоги > As3 изучение и немного As2

Рейтинг: 3.67. Голосов: 3.

Обертка для DDL . С миру по нитке...

Запись от in4core размещена 03.02.2012 в 15:03

Предыстория : когда то давно писал свой первый сайт, где то увидел, что можно прикрутить Deep Linking к флеш сайту, решил задаться этим вопросом, - попал соотв на библиотеку SwfAddress. В то время она мне показалась очень продвинутой, а главное работает! Поковырявшись в документации, прикрутили. В то время, я еще совсем плохо знал и ас2, а о JS вообще понятия не имел. И вот сейчас подумал, а не попробовать ли мне написать свою обертку, так сказать, свой велосипед. Ну что ж, поехали...

Постараюсь описать подробно все, что я узнал, и каким образом собрал DDL либу. Забегая вперед, сразу опишу, что нам пригодится для качественного линкования. ( не зря назвал с миру по нитке, создание либы было похоже на написания реферата сидя в библиотеке, - прочел часть из одной книги вырезал, редактировал, принялся за другую.. и так из кусочков собирается реферат ).

1. Базовые знания JS ( таковых у меня не было, пришлось разбираться )
2. Библиотека JQuery
3. Плагин для JQuery ( hash )
4. Ну и собственно ас3 )

DDL
Начал с того, что в поисковике вбивал фразы типа изменить заголовок страницы через JS и т.п. находил отдаленные куски кода. Очень мне помог САЙТ. Видимо приятно написанная документация по JS.
Потихоньку разбираясь , мы понимаем, что работать нам придется лишь с глобальными методиками JS - document , window , location.
На сколько я понял - document есть наша html страничка, тоесть весь ее код, или оболочка. Window - соотв окно в котором размещается наш document. Document должен где то хранится - поэтому у документа есть след уровень location , указывающий на URL , доменные имена и т.п.
Адрес в браузерной строке может выглядеть так http://my.com/mysite/ или например так http://my.com/mysite/#mySuper
-первое утверждение есть href для location , второе hash . Hash отличается тем, что не перегружает страничку , собственно на хеше и строится DDL.
Давайте попробуем создать свой первый метод, меняющий хеш в строке, напишем :

Код:
function setLocation(value) {  
document.location.hash = '#' + value;
}
Ага, все довольно просто . Собственно JS - это по сути тот же AS2 , только менее функциональный , синтаксис на лицо.
Ну что же, метод создали, осталось прикрутить к флешу и проверить , как оно работает. Для прикрутики воспользуемся ExternalInterface .
ExternalInterface имеет 2 основных метода call и addCallBack . Первый вызывает метод JS , второй ссылается на метод JS и может быть вызван из JS ( тоесть в первом случае флеш дергает JS , во втором JS - флешу ).
В данном случае нам потребуется 1й метод. Пишем :
Код AS3:
stage.addEventListener(MouseEvent.CLICK , onClick);
function onClick(e:MouseEvent) {
ExternalInterface.call('setLocation' , 'superHash' + new Date().getTime() );
}
Да кстати, пока не забыл, нужно наш JS скрипт сохранить как например myDDL.js ( UTF-8 кодировка ) и в хиде html встроить его как
Код:
<script src="myDDL.js" type="text/javascript"></script>
Шикарно, теперь можно запускать наш html через удобный вам браузер и щелкая по сцене видеть изменение строки URL.
Что нам еще нужно для качественного DDL ? Ну наверное изменение заголовка страницы, установка статуса , может какие то еще фишечки... Попробуем изменить заголовок страницы , лезем в JS справочник, ага

Код:
function setWindowTitle(value) { 
	
	document.title = value; 
}
Да уж, все проще простого. А теперь статус :

Код:
function doSetStatus(value) { 
	
	window.status = value; 
}
Отлично минимальный набор готов, протестируем.
Собственно с этого пункта я поплыл, когда статус строки не захотел меняться. Полез опять в гугл, читал читал, искал искал... все одно - пишите так ( как выше ) и все будет работать... Так бы и забил на этот пункт, если бы на каком то сайте не увидел надпись : Данная фича по умолчанию отключена у большинства браузеров и включается вручную. Ухх... значит не мой косяк... проехали. Тем временем я вспомнил про SWFAddress и решил посмотреть , а может у них работает ?! - Фигушки и у них строка статуса не работает, видимо, что то случилось Кроме того, пока искал полазил по их исходникам и ужаснулся.... такая муто-дребедень и чего они там писали все эти годы?! ... тонны никому не нужного кода основанные на регэкспах и переборах символов в строках . Каюсь, углубляться далеко не стал, возможно там много полезного того, что я просто не заметил или не понял - или вообще мой код будет не формат по сравнению с ними, но тесты показали, что моя система работает во всех браузерах без каких либо проблем ( всех* - современных версиях ).
Тем временем читатель попробовавший , то что я описал, мог заметить - кнопки вперед, назад - РАБОТАЮТ! Хм... подумал я, и чего там SWFA мучались? И тут я заметил, что история то работает, и урл меняется, но события о изменении не происходит... ага попался жучок...подумал я, и начал дальше курить мануалы.
Но прежде чем, говорить об этом, стоит сначала разобрать работу addCallBack у EI.
Первым делом откроем справочник адоба зайдем в EI - посмотрим пример и слямзим метод JS
Код:
function thisMovie(movieName) {
        
	if (navigator.appName.indexOf("Microsoft") != -1) {
        
		return window[movieName];
       
	} else {
        
		return document[movieName];
		
    }
}
Потребуется он нам, чтобы устанавливать тот самый коллбек. Правда в примере от адоба как то все запутано, - распутаем щас )

Модернизируем наш метод по установке урла так :
Код:
function setLocation(value) {  
document.location.hash = '#' + value;
thisMovie(movie).getCall(value);
}
Где вместо movie нужно написать название нашего swf файла, без .swf
А в AS напишем
Код AS3:
ExternalInterface.addCallback("getCall" , callBackMethod);
function callBackMethod(value:String):void {
 trace('getCallBackFromJS' + value);
}
В методе JS thisMovie , появилась новая тема navigator - это наш батеньки браузер, через что мы заупскаем наш документ. Тоесть этот метод возвращает нам ссылку на нашу флешу отталкиваясь от производителя либо Netscape либо Microsoft(IE).
И так если все окей, после нажатия на сцену, в каком нить дебаг-профайлире мы увидим трейс , что заголовок изменен на value.

Теперь вернемся к нашим баранам. Коллбек при установке мы видим, а вот при изменении адреса вручную или кнопками вперед-назад - НЕТ! Оно и понятно... А что же делать ? Курим мануалы дальше...
* Наверное вы находили какие нибудь события? - Да мы копали копали и находили какие то события... но есть у меня один могильничек....* Собственно данная тема и выражает всю сущность событий JS - это порнография. Как таковых приятных нам addEventListener тут нет, зато есть всякие OnLoad, onChange да и то для форм html документа, или закрытия страницы. Наверняка нам помогло бы событие onUnload - запускающиеся при смене урл страницы, выгружая весь документ, но нет - у нас же хеш , а на него не влияет, ведь перезагрузки не происходит. Думаю дальше, ага таймеры то есть в JS - можно повесить 1 секундный таймер и получать изменение строки браузера. Однако, зачем нам лишняя обертка да еще и таймером? Читаем мануалы дальше, не забывая про гугл. Натыкаемся на JQuery - а что это? Вики ответит - это либа JS написанная умными дядьками, там и события есть и много всего, но вникать мы в нее не будем сильно, а просто скачаем, и установим в хтмл как обычный js файл. А так же скачаем плагин для jQuery для хеша отсуда И так же установим в хидер.
Обновим наш мега файл DDL следующей методой

Код:
function setLocation(value) {  
document.location.hash = '#' + value;

}

$(function(){

 
  $(window).hashchange( function(){ thisMovie(movie).getCall(location.hash); })

 
  $(window).hashchange();

});
Теперь у нас коллбек будет вызываться всегда и при установке урл вручную и из флеша, и кнопками вперед-назад. Собственно все готово, можно собирать все в либу и пользоваться, пользоваться...
Вот, что получилось у меня :
DDL.js
Код AS1/AS2:
/**
 * ...
 * @author in4core lab
 * DYNAMIC DEEP LINKING - JS utils v1.0
 */
 
var movie = ''; // calle from AS
 
// events name
 
var eLocation = 'jsSetLocation';
var eTitle    = 'jsSetTitle';
var eCookie   = 'jsSetCookie';
var eStatus   = 'jsSetStatus';
 
function thisMovie(movieName) {
 
	if (navigator.appName.indexOf("Microsoft") != -1) {
 
		return window[movieName];
 
	} else {
 
		return document[movieName];
 
    }
}
 
function setMovieName($name) {
 
	movie = $name;
}
 
$(function(){
 
 
  $(window).hashchange( function(){  thisMovie(movie).onChange(eLocation , location.hash); })
 
 
  $(window).hashchange();
 
});
 
 
function getBrowserType() {
 
	return navigator.appName;
}
 
function getURL() { 
 
	return document.URL; 
}
 
function getBrowser() { 
 
	return navigator.appCodeName; 
}
 
function getDomain() { 
 
	return document.domain;
}
 
function reloadPage() { 
 
	document.location.reload(); 
}
 
function doSetLocation(path) { 
 
	document.location.href = path; 
}
 
function doSetWindowTitle(title) { 
 
	document.title = title; 
 
	thisMovie(movie).onChange(eTitle , title);
}
 
function doSetStatus(title) { 
 
	window.status = title; 
 
	thisMovie(movie).onChange(eStatus , title);
}
 
function doSetCookie( $name , $value ) { 
 
	if(navigator.cookieEnabled) {
 
		document.cookie = $name + "=" + escape($value); 
 
		thisMovie(movie).onChange(eCookie , $name + ':' + $value);
	}
}
 
function doGetCookie( $name ) {
 
	var cookie = " " + _doc.cookie;
	var search = " " + $name + "=";
	var setStr = null;
	var offset = 0;
	var end = 0;
 
	if (cookie.length > 0) {
 
		offset = cookie.indexOf(search);
 
		if (offset != -1) {
 
			offset += search.length;
			end = cookie.indexOf(";", offset)
 
			if (end == -1) {
				end = cookie.length;
			}
 
			setStr = unescape(cookie.substring(offset, end));
		}
	}
 
	return(setStr);
}
Про set и get Coockie нашел на каком то сайте, авось пригодится. Добавил в релиз.

DDLBroadcaster.as

Код AS3:
package com.in4core.jsreader 
{
	import flash.display.LoaderInfo;
	import flash.errors.IllegalOperationError;
	import flash.events.EventDispatcher;
	import flash.external.ExternalInterface;
	/**
	 * ...
	 * @author in4core lab
	 */
	public final class DDLBroadcaster
	{
		private static const SPLIT :String = "#";
		private static const STRICT:String = "/";
 
		private static var _useStrict:Boolean = false;
		private static var _historyObject:Vector.<String> = new Vector.<String>;
		private static var _ddlDispatcher:EventDispatcher = new EventDispatcher();
		private static var _availability:Boolean = false;
 
		public function DDLBroadcaster() {
 
			throw new IllegalOperationError("this class doesnt have a instance"); 
		}
 
		public static function initialize(loaderInfo:LoaderInfo):void {
 
			if (ExternalInterface.available) {
 
				_availability = true;
 
				const a:Array = loaderInfo.loaderURL.split("/");
				const s:String = a[a.length - 1].split(".swf").join("");
 
				ExternalInterface.call("setMovieName" , s);
 
				ExternalInterface.addCallback("onChange" , onChange);
			}
		}
 
		/////////////////////////////////////////////////////////////////
		//4
		//4                      PUBLIC METHODS                                    
		//4                                                          
		/////////////////////////////////////////////////////////////////
 
		public static function addEventListener(ddlEventName:String , closureFunction:Function):void {
 
			_ddlDispatcher.addEventListener(ddlEventName , closureFunction);
		}
 
		public static function doSetLocation(location:String):void {
 
			const path:String = SPLIT + location + (useStrict ? STRICT : "");
 
			call("doSetLocation", path);
 
			_historyObject.push ( fullURL );
		}
 
		public static function doSetStatus(status:String):void {
 
			call("doSetStatus", status);
		}
 
		public static function doSetWindowTitle(title:String):void {
 
			call("doSetWindowTitle" , title);
		}
 
		public static function setCookie(cookName:String , value:String):void {
 
			call("setCookie", cookName , value);
		}
 
		public static function getCookieByName(name:String):String {
 
			return call("getCookie" , name );
		}
 
		public static function getHistory():Vector.<String> {
 
			return _historyObject;
		}
 
		public static function reloadPage():void {
 
			call("reloadPage");
		}
 
		/////////////////////////////////////////////////////////////////
		//4
		//4                     PUBLIC SPECIAL                                     
		//4                                                          
		/////////////////////////////////////////////////////////////////
 
		public static function getStrictLocationAsArray():Array {
 
			var URL:String = fullURL;
 
			if (URL.search(SPLIT) != -1 ) {
 
				URL = URL.slice( URL.indexOf(SPLIT) + 1 );
 
				return URL.split ( STRICT );
			}
 
			return null;
		}
 
		/////////////////////////////////////////////////////////////////
		//4
		//4                    DDL GETTERS  / SETTERS                                   
		//4                                                          
		/////////////////////////////////////////////////////////////////
 
		public static function get available():Boolean {
 
			return _availability;
		}
 
		public static function get useStrict():Boolean {
 
			return _useStrict;
		}
 
		public static function set useStrict(bool:Boolean):void {
 
			_useStrict = bool;
		}
 
		public static function get browserName():String {
 
			return call("getBrowser");
		}
 
		public static function get fullURL():String {
 
			return call("getURL");
		}
 
		public static function get currentDomain():String {
 
			return call("getDomain");
		}
 
		/////////////////////////////////////////////////////////////////
		//4
		//4                        PRIVATE UTILS                                    
		//4                                                          
		/////////////////////////////////////////////////////////////////
 
		private static function call(JSMethod:String , ...rest):String {
 
			if (_availability) return ExternalInterface.call(JSMethod , rest);
 
			return null;
		}
 
		private static function onChange(changeEvent:String , callBack:String):void {
 
			_ddlDispatcher.dispatchEvent(new DDLBroadcasterEvent(DDLBroadcasterEvent.DDL_ON_CHANGE , callBack , changeEvent));
		}
	}
 
}
Название мувика я решил взять с loaderInfo и передать его в JS, нежели править JS тем, кто в нем не разбирается, хотя и правка минимальна. Да, кстати, историю посещений мы тоже пишем себе, но пока только для установки урл из флеша ( для кнопочных браузера вешать не стал пока). И добавил метод onChange - вызываемый при любом изменении заголовка, урл, статуса, или кук.

Main.as

Код AS3:
DDLBroadcaster.useStrict = true;
DDLBroadcaster.initialize(loaderInfo);
DDLBroadcaster.addEventListener(DDLBroadcasterEvent.DDL_ON_CHANGE , onChange);
private function onChange(e:DDLBroadcasterEvent):void 
		{
			tf.appendText ( e.callBack + ' : ' + e.changeName + '\n' );
			tf.appendText ( 'Browser : ' + DDLBroadcaster.browserName + '\n' );
			tf.appendText ( 'Domain : ' + DDLBroadcaster.currentDomain + '\n' );
			tf.appendText ( 'FullURL : ' + DDLBroadcaster.fullURL + '\n' );
			tf.appendText ( 'DDL Use Strict by end : ' + DDLBroadcaster.useStrict + '\n' );
		}
Ну как то так...
И соотв для полной картины
index.html
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
	<title>IN4CORE WORK TABLE</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="language" content="en" />
	<meta name="description" content="" />
	<meta name="keywords" content="" />
	
	<script src="jquery-1.7.1.min.js" type="text/javascript"></script>
	<script src="jquery.ba-hashchange.js" type="text/javascript"></script>
	<script src="DDL.js" type="text/javascript"></script>
	
	<script src="js/swfobject.js" type="text/javascript"></script>
	<script type="text/javascript">
		var flashvars = {
		};
		var params = {
			menu: "false",
			scale: "noScale",
			allowFullscreen: "true",
			allowScriptAccess: "always",
			bgcolor: "#FFFFFF"
		};
		var attributes = {
			id:"IN4COREWORKTABLE"
		};
		swfobject.embedSWF("IN4COREWORKTABLE.swf", "altContent", "100%", "100%", "10.0.0", "expressInstall.swf", flashvars, params, attributes);
	</script>
	<style type="text/css">
		html, body { height:100%; overflow:hidden; }
		body { margin:0; }
	</style>
</head>
<body>

	<div id="altContent">
		<h1>IN4CORE WORK TABLE</h1>
		<p>Alternative content</p>
		<p><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></p>
	</div>
</body>
</html>
Ссылки на полезное и используемое в статье :
W3C School ( http://www.w3schools.com/js/ )
JQuery ( http://jquery.com/ )
Hash для JQuery ( http://benalman.com/projects/jquery-hashchange-plugin/ )

Если что то забыл, или где то не корректно написал про JS - поправьте, исправим.
Всего комментариев 30

Комментарии

Старый 03.02.2012 16:00 Astraport вне форума
Astraport
 
Аватар для Astraport
Полезно. Не очень понятно каково практическое применение.

Я вот все жду реализацию слушателя JS функций из флэша без сокетов.
Старый 03.02.2012 16:28 fish_r вне форума
fish_r
 
Аватар для fish_r
а SWFAddress не устраивает?
Старый 03.02.2012 16:32 CEBEP вне форума
CEBEP
 
Аватар для CEBEP
fish_r, может у SWFAddress есть фатальный недостаток
Старый 03.02.2012 16:34 Jewelz вне форума
Jewelz
 
Аватар для Jewelz
> Я вот все жду реализацию слушателя JS функций из флэша без сокетов.

по-подробней плиз
Старый 03.02.2012 17:09 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
а SWFAddress не устраивает?
Свое и понятней, и + опыт, и не надо разбираться в чужих исходниках ( зайди ради интереса в их JS и попугайся) . А что самое важное они решили бросить обновлять либу, а на дворе хтмл 5 и работа с хешем скоро будет в 1 метод

Цитата:
Не очень понятно каково практическое применение.
www.2advanced.com как пример
Старый 03.02.2012 17:27 Astraport вне форума
Astraport
 
Аватар для Astraport
Цитата:
по-подробней плиз
ExternalInterface позволяет вызвать JS функцию и получить колбэк один раз. А вот как получать колбэки постоянно как только они поступают от сервера? Нужна какая-то JS приблуда которая установит постоянное соединение с флэш и будет постоянно к нему обращаться и слать данные при получении команд с сервера.
Например есть comet сервер и он шлет команды js-клиентам, которые работают со своими флэшками.


Я понимаю, что это невозможно, но вдруг что-то такое народится. Сейчас единственный выход таймер.
Старый 03.02.2012 17:34 Astraport вне форума
Astraport
 
Аватар для Astraport
Цитата:
www.2advanced.com как пример
Этот сайт видимо как-то использует обертку?
Только в адресной строке и всё?
Старый 03.02.2012 18:29 in4core вне форума
in4core
 
Аватар для in4core
Astraport нет вся задача в том, чтобы делать переходы по флеш сайту через строку. Тоесть набрал например #contacts/hello а во флеше нажалась кнопка перехода в контакты и заполнилась первая строка в форме словом хелло
Старый 03.02.2012 18:30 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Я понимаю, что это невозможно, но вдруг что-то такое народится. Сейчас единственный выход таймер.
Поковыряйтесь в JQuery там события есть, мне кажется можно сделать все
Старый 03.02.2012 18:55 fish_r вне форума
fish_r
 
Аватар для fish_r
Astraport, а ExternalInterface.addCallback() разве не то, что нужно?
Старый 03.02.2012 19:47 crazyone вне форума
crazyone
 
Аватар для crazyone
Зачем тянуть JQuery, если нужно просто посмотреть состояние location.href?
Старый 03.02.2012 20:02 Astraport вне форума
Astraport
 
Аватар для Astraport
Цитата:
Astraport, а ExternalInterface.addCallback() разве не то, что нужно?
Оно же сработает только один раз?
Старый 03.02.2012 20:10 fish_r вне форума
fish_r
 
Аватар для fish_r
Нет, это и есть интерфейс открытый для вызовов из js-а.
Старый 03.02.2012 20:50 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Зачем тянуть JQuery, если нужно просто посмотреть состояние location.href?
Каким образом ты хочешь это сделать , кроме как по таймеру? Нам же нужно проверять кнопки вперед назад и ручной ввод хеша
Старый 03.02.2012 22:50 crazyone вне форума
crazyone
 
Аватар для crazyone
Цитата:
Каким образом ты хочешь это сделать , кроме как по таймеру? Нам же нужно проверять кнопки вперед назад и ручной ввод хеша
Таймер прекрасно справляется с этой задачей. А в браузерах поновее есть соответствующее событие. Кстати, по твоей же ссылке об этом написано:
Цитата:
Right now, in Internet Explorer 8, Firefox 3.6+, and Chrome 5+, you can bind callbacks to the window.onhashchange event and use it without any kind of plugin.
Подключать для таких целей JQuery, это как подключать весь флекс-фреймворк, чтобы сделать одну кнопку.
Старый 03.02.2012 23:25 in4core вне форума
in4core
 
Аватар для in4core
crazyone да новые браузеры , но пока не у всех стоят. а каждую секунду делать проверку на стороне не считаю красивым решением. я лучше потрачу несколько лишних кб при загрузке страницы , чем повешу таймер на сайд. Думаю через пол годика можно смело садится на onhashChange , что собственно и сделаем
Старый 04.02.2012 02:32 Aloran вне форума
Aloran
А как это в JQuery реализовано? Может как раз через таймер... А если нет, то может забрать оттуда только кусок отвечающий нашим нуждам?
Старый 04.02.2012 02:43 in4core вне форума
in4core
 
Аватар для in4core
Там по-моему, насколько я сумел прочитать все таки реализована событийная модель, видимо не таймер. Ну я думаю проще взять всю библу, чем искать тот кусок, без особого понятия где он находится ) для меня лично 18 кб не критично. Но по факту, думаю стоит проверить onHashCHange все таки на всех браузерах и если работает тупо на него перейти. Кроме всего прочего, я думаю реализаций еще много всяких ) я показал свой пример, какой сумел собрать, таймер я тоже собирал, но поставило меня это под сомнение и вышел на JQuery
Старый 04.02.2012 12:39 Hauts вне форума
Hauts
 
Аватар для Hauts
При желании можно с помощью EI вписывать необходимый js-функционал на страницу, тем самым не подключая скрипты в хтмл-коде.

Ну и, в добавок, некоторые браузеры (если я не ошибаюсь), будут некорректно работать с изменением hash`а и кнопками вперед-назад, если на странице нет якоря с соответствующим значением.

А вообще было бы неплохо использовать новые возможности с изменением адресной строки без перезагрузки страницы и без решетки ("#").
Старый 04.02.2012 12:43 Hauts вне форума
Hauts
 
Аватар для Hauts
in4core, если такого рода задачи вам интересны, могу предложить вам попробовать реализовать следующее: без подключения каких-либо сторонних скриптов и какого-либо js-кода на страницу, сделать возможным изменение размеров флэшки изнутри самой флэшки. И с учетом случаев, когда таких флэшек несколько на странице.

Если идея интересна, могу поделиться своими соображениями
Старый 04.02.2012 13:47 fish_r вне форума
fish_r
 
Аватар для fish_r
in4core а где реализация DDLBroadcasterEvent ?
Старый 04.02.2012 14:38 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
При желании можно с помощью EI вписывать необходимый js-функционал на страницу, тем самым не подключая скрипты в хтмл-коде.
Очень интересно, расскажите об этом, дополним статью.

Цитата:
Ну и, в добавок, некоторые браузеры (если я не ошибаюсь), будут некорректно работать с изменением hash`а и кнопками вперед-назад, если на странице нет якоря с соответствующим значением.
Ну моя реализация вроде везде щас работает, честно говоря не понял насчет НЕТ якоря - ?!
Цитата:
А вообще было бы неплохо использовать новые возможности с изменением адресной строки без перезагрузки страницы и без решетки ("#").
С этого момоента поподробнее, где почитать ?

Цитата:
Если идея интересна, могу поделиться своими соображениями
Почему же неинтересна? Рассказывайте конечно

Цитата:
in4core а где реализация DDLBroadcasterEvent ?
Обычный кастом эвент , сгенерированный FD с 2 личными параметрами. Собственно и выкладывать то его смысла нет
Старый 06.02.2012 10:37 Hauts вне форума
Hauts
 
Аватар для Hauts
Цитата:
При желании можно с помощью EI вписывать необходимый js-функционал на страницу, тем самым не подключая скрипты в хтмл-коде.
Можно, например, получить хэш таким образом:
Код AS1/AS2:
ExternalInterface.call("function (){return document.location.hash}");
Соответственно можно и другие функции вызывать. Так же можно избавиться от анонимности функций и действительно добавить их на страницу (тем самым дав возможность использовать эти функции вне флэша):

Код AS1/AS2:
import flash.external.ExternalInterface;
 
this.onMouseMove = function() {
	var hash = ExternalInterface.call("function (){return window.___fl.getHash();}");
	txt.text = hash
}
 
this.onMouseDown = function(){
	ExternalInterface.call("function (){if(window.___fl){return};window.___fl = {getHash:function(){return document.location.hash;}};}");
}
Я по-быстрому на ас2 накидал пример, чтобы заодно и самому не ошибиться и потестировать.

В примере по нажатию мышки создается объект window.___fl, к которому уже можно обращаться и из флэшки, и со страницы (я имею в виду, например, "alert(window.__fl.getHash())").

В общем, думаю, идея ясна.

Цитата:
А вообще было бы неплохо использовать новые возможности с изменением адресной строки без перезагрузки страницы и без решетки ("#").
Можно посмотреть здесь.

Про остальное напишу чуть позже
Старый 06.02.2012 15:12 in4core вне форума
in4core
 
Аватар для in4core
Hauts - да это все понятно, что можно использовать анонимные функции. Но это не есть хорошо, даже плохо я бы сказал. Я кстати не вижу ничего страшного в использовании 1кб файла JS в html. Смысл переносить все во флеш, да еще с анонимом? Тоже самое с объектом, как не крути - анонимность.
Насчет можно посмолтреть здесь - fireFox 3.6 - отказался работать с этим, chrome 5 - работать стал, но дико криво - результат пока рано еще переходить на данный функционал.

Ждем ответов про остальное!!!
Старый 06.02.2012 18:36 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
синтаксис на лицо
grammaNaziModeOn на какое такое лицо?
И имхо jquery тут лишний
ExternalInterface#addCallback - в самый раз.
Изменилось что-то диспатчим из js во флэш событие.
У меня во флэше - это колбэк вида:
Код AS3:
public function  jsNotifyHandler (eventName:String, ...args):void
Обновил(-а) Котяра 06.02.2012 в 19:23
Старый 06.02.2012 20:58 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
И имхо jquery тут лишний
ExternalInterface#addCallback - в самый раз.
Котяра коллбек тут непричем. Разговор идет только про hash , событие изменения которого можно поймать только через событийную модель JQuery или таймер. HTML5 на данный момент не поддерживает часть версий браузеров, лично у меня по ссылке ни 1 браузер корректно не отработал.
Аддколбек по сути в любом случае отрабатывает вручную из JS - тоесть пока JS не вызовет метод , собстенно у меня и есть
Код AS3:
ExternalInterface.addCallback("onChange" , onChange);
о чем ты и говоришь
Старый 06.02.2012 21:00 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Изменилось что-то диспатчим из js во флэш событие.
Собственно вот и вопрос, как без jQuery или таймера JS поймет изменилось что или нет. Если у тебя есть лучшее архитектурное решение с удовольствием переформатирую статью
Старый 07.02.2012 02:19 Котяра вне форума
Котяра
 
Аватар для Котяра
jQuery - это жс. Он же как-то ловит событие.
Старый 07.02.2012 03:46 in4core вне форума
in4core
 
Аватар для in4core
Ну так вот, о том и вопрос. как он ловит, ты вкурсе? Мне например сложно понять весь движок, проще пихнуть его жертвуя 20 кб
Старый 07.02.2012 11:13 fish_r вне форума
fish_r
 
Аватар для fish_r
Цитата:
Разговор идет только про hash , событие изменения которого можно поймать только через событийную модель JQuery или таймер.
То есть вас, отчего то, смешит и пугает прикручивать вполне проas-овский swfAddress ("там много регекспов" o_O, смотрел его кстати - вполне в стиле "actionscript" написано), а jQuery в котором регекспов ещё больше не пугает. Вы, что думаете событие изменение хеша, в jQuery каким-то другим, волшебным, образом отлавливается кроме как через таймер? Т.е. вместо того, чтобы сделать таймер, тупо во флеше, или в js, вы прикручиваете сверхизбыточный механизм jQuery ( и ещё какую-то фичу?), лишь бы только не было очевидно что проверка состояния хеша выполняется по таймеру?

Цитата:
можно использовать анонимные функции. Но это не есть хорошо, даже плохо я бы сказал. Я кстати не вижу ничего страшного в использовании 1кб файла JS в html. Смысл переносить все во флеш, да еще с анонимом? Тоже самое с объектом, как не крути - анонимность.
В вашем коде нет ничего, что заслуживало бы размещения в отдельном файле js. К чему эти высокоинтеллектуальные рассуждения? Вы, по сути, управляете свойствами браузера из, и в интересах флеш-объекта на странице, больше эти манипуляции никого не интересуют, по той причине, что на странице больше, просто, нет заинтересованных объектов, в представленном вами контексте.И об анонимности тут речи не идет - управление реализуется из вполне себе именованных методов as-скрипта так, что именованы функции js-а, или нет - не имеет ни какого значения.
 

 


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


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