Просмотр полной версии : Как назначить обработчик сразу нескольким элементам.
Здравствуйте.
Начал изучать ActionScript 3.0 - помаленьку. Приятно удивился что он очень похож на JavaScript. Во не в сети не доках отыскать пример - как назначить слушатель события сразу нескольким элементам. Как например в jQuery $('.element1, .element2').on('click'...);
Как можно здесь так сделать.
Что то типа такого есть:
(a1, a2, a3).addEventListener(MouseEvent.CLICK, myFunction);
...
Спасибо.
Или в цикле, или ловить событие на фазе всплытия в родительском контейнере.
OlmerDale
21.03.2015, 23:00
Первым делом забудьте о том, что языки похожи. Вы можете испытать шок, но между ними схожести как у губастой курицы с лошадью. по этому подойдите к as3, как к новому языку, о котором вы ничего не знаете.
А то с таким же успехом можно сказать, что js и на c++ и на python похож.
И не ищите похожего на jQ, которую даже в js уже пора забыть, в as3 к счастью вообще другая идеология.
ZackMercury
22.03.2015, 00:08
function $(...args)
{
for(var i:int = 0; i < args.length-1; i ++)
{
args[i].addEventListener(MouseEvent.CLICK, args[length-1] as Function);
}
}
function onClick(e:Event):void
{
trace(e.currentTarget.name + " was clicked.")
}
$(someObj1, someObj2, someObj3, someObj4, onClick);
Хотите более серьёзных возможностей - пишите большой код.
Но если хотите писать серьёзные приложения - приучитесь придерживаться правил и конвенций языка, как написал OlmerDale.
В AS3 есть устоявшиеся конструкции, и большой простор фантазии в стиле ООП(чего в JS, по моему мнению никогда не будет).
Если хотите написать свой jQuery на AS3, никто не в силах будет вам помешать.
К примеру, функция $ в jQuery используется для получения элементов на странице. Это вызвано тем, что для получения элемента следует писать длинную конструкцию ака document.getElementById("...").
В AS3 это не нужно, элементы легко можно получить по именам(в IDE по instance name).
Первым делом забудьте о том, что языки похожи. Вы можете испытать шок, но между ними схожести как у губастой курицы с лошадью. по этому подойдите к as3, как к новому языку, о котором вы ничего не знаете.
А то с таким же успехом можно сказать, что js и на c++ и на python похож.
И не ищите похожего на jQ, которую даже в js уже пора забыть, в as3 к счастью вообще другая идеология.
Ну конечно же я не имел виду что языки жёстко похожи, сам синтаксис написания кода немного схож.
В общем я так и сделал в цикле:
var buttons:Array = [b1, b2, b3, b4, b5];
var i:int;
for (i = 0; i < buttons.length; i++){
buttons[i].addEventListener(MouseEvent.MOUSE_OVER, myOver);
buttons[i].addEventListener(MouseEvent.CLICK, go_url);
}
function myOver(e:Event){
...
}
Вот ещё подскажите как можно строковое значение сделать именем объекта - чтобы можно было к нему применить .play(); и т.д..
Ну к примеру у меня есть символ на сцене с именем MyAnination.
Как можно сделать такое, превратить строковую переменную в имя объекта
var name = MyAnimation; // Так работает
var name = 'MyAnimation'; // Так ругается.
name.play();
OlmerDale
22.03.2015, 00:15
(чего в JS, по моему мнению никогда не будет).
js намного лучше чем и ооп'шней as3.
ZackMercury
22.03.2015, 00:28
OlmerDale, по ощущениям он как пайтон, ООП есть, но не вставляет. Та же фигня и с C++. Я же сказал не ООП нет, а простора фантазии.
В JS нельзя объявить класс, только объект, нет пакетов, всё выглядит однообразно.
Другое дело, Java и AS3. Мои любимые.
C++ до сих пор процедурный. И вряд ли когда-нибудь станет полностью объектным.
JS тоже не полностью объектно-ориентированный.
Это выглядит как война между процедурными языками и объектно-ориентированными. Кто дольше продержится. Ну-с)
P.S. Простите за оффтоп...
Добавлено через 11 минут
Как можно сделать такое, превратить строковую переменную в имя объекта
var name = MyAnimation; // Так работает
var name = 'MyAnimation'; // Так ругается.
name.play();
var name = this.MyAnimation;
var name = this['MyAnimation'];
name.play();
В JS, кстати, та же ерунда - obj.value == obj["value"].
caseyryan
22.03.2015, 09:24
Первым делом забудьте о том, что языки похожи. Вы можете испытать шок, но между ними схожести как у губастой курицы с лошадью
Не надо утрировать. Языки на самом деле очень похожи. И основаны на одних стандартах ECMA. Так что схожести у них как у курицы с гусем.
js намного лучше чем и ооп'шней as3.
JS ничем не лучше, и уж точно не ооп'шней. У каждого свои задачи и цели. И сейчас эти цели все больше расходятся.
Вот изложу в коде чего добиваюсь, и как сделать такое.
У меня есть на сцене 10 кнопок b1, b2, b3, b4, b5... и т.д.
И есть 10 Мувиков - с именами a1, a2, a3, a4... и т.д.
При наведении на кнопки должны запускаться соответствующие Мувики.
На кнопках висит обработчик MOUSE_OVER.
И что бы в функции по обработчику не городить такое в 10 строк, а их может быть и больше:
function myOver(e:Event)
{
var drum:_84 = new _84();
drum.play();
var nameButton = e.target.name;
if(nameButton == 'b1') a1.play();
else if(nameButton == 'b2') a2.play();
else if(nameButton == 'b3') a3.play();
else if(nameButton == 'b4') a4.play();
...
...
}
Я хочу:
var nameClip = e.target.name.replace('b', 'a');
// И запустить соответствующий Мувик
// При таком раскладе - ошибка
nameClip .play();
ZackMercury
22.03.2015, 14:09
this[nameClip].play();
this[nameClip].play();
Спасибо, понял. Что бы понять, этой конструкцией мы указали что строковая переменная должна восприниматься как объект в текущем контексте. Так?
Объясните суть если я не правильно понял.
Спасибо.
ZackMercury
22.03.2015, 14:47
В текущем контейнере, т.е. текущем экземпляре MovieClip, чем бы он не являлся - главной линией времени, или вложенным мувиком. Если вы пишете в кадрах - вы просто абстрагируетесь от использования классов.
На самом деле вы работаете с экземплярами классов неявным образом.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.