PDA

Просмотр полной версии : Как добавить Listener к Button?


GrooveSonic
25.10.2002, 14:47
Насколько я понял у объекта Button отсуствует метод addListener(), а так хочется,

чтобы мой клип ловил скажем onRollOver от кнопок!!!. Именно от действующих кнопок на сцене.

Есть выход?

MovieClip тоже умеет генерить onRollOver, но это же не кнопка!!!.

Nox Noctis
25.10.2002, 19:12
хм.

btn.onRollOver = function() {
trace(this);
this.broadcastMessage("btnRollOver");
};
mc.btnRollOver = function() {
trace(this);
};
ASBroadcaster.initialize(btn);
btn.addListener(mc);
где
'btn' - это имя твоей кнопки
'mc' - это имя клипа, который ловит событие 'btnRollOver'

GrooveSonic
25.10.2002, 20:03
Читал твой урок тут. Респект, респект. :-) Теперь по делу. Все что ты написал не лишено смысла, но не подходит для моего случае. А случай тяжелый. Пишу мышиный компонент. Вот кусок кода:

#initclip
....................
function mouseClass() {
this.init();
}
mouseClass.prototype.init = function() {
theTarget = this._parent[this._targetInstanceName];
Mouse.hide();
theTarget.gotoAndStop("Out");
startDrag(theTarget, true);
ASBroadcaster.initialize(this);
};
Button.prototype.onRollOver = function() {
theTarget.gotoAndStop("Over");
};
...................

как видно theTarget объявлен в _root, что теоретически может вызвать конфликт, если юзер тоже определит в _root переменую с таким же названием. Если theTarget определить в обьекте, то из Button не будет его видно. Ну а определение в функции можно не обсуждать. Так как быть? Где определить этот не счастный theTarget, чтобы он был инкапсультирован в класс и в то же время чтобы Button видел. Выход нашел такой, что сделать mouseClass лисенером Button и писать код для onRollOver от mouseClass, а не от Button как приведено выше. Думал, что молодец, нашел выход, но батюшки. Макромедии опленились сделать addListener() для Button. That's suck. Вот собственно и всплыл вопрос. Как думаешь выйти из ситуации?

Nox Noctis
25.10.2002, 21:32
ну, начнем с того, что Button.prototype.onRollOver тут не годится...

ведь тогда если определить у кнопки событие onRollOver - то онРоллОвер из прототипа вызываться не будет - а значит и твоя конструкция работать не будет...

и addListener тут НЕ ПРИ ЧЕМ =)
потому что онРоллОвер - это индивидуальное события каждой кнопки,
а не что-то вроде онЕнтерФрейм или онМаусДаун, сообщения о которых рассылаются одновременно всем слушающим объектам...

все хитрее - тебе нужно сделать так, чтобы кроме (КРОМЕ, а не ВМЕСТО) присвоенного онРоллОвера срабатывала еще и твоя функция настраивающая курсор...

от того, как ты решишь эту, более сложную проблему - зависит где и как определить theTarget...

мне счас лениво изобретать, спать пора =)

Nox Noctis
25.10.2002, 23:10
так, очередной велосипед был успешно разработан и запущен =)))

// функция настройки курсора. вставишь все нужные тебе действия.
Button.prototype.rollOverCursor = function() {
trace("Cursor Adjust");
};
// сеттер (порода собак такая)
Button.prototype.setRollOver = function(newFunction) {
this.rollOver = newFunction;
};
// геттер (тоже что сеттер, только наоборот)
Button.prototype.getRollOver = function() {
return function () {
this.rollOverCursor();
this.rollOver();
};
};
// прячем лишнее, создаем геттер/сеттер свойство
ASSetpropflags(Button.prototype, ["getRollOver", "setRollOver"], 7);
Button.prototype.addProperty("onRollOver", Button.prototype.getRollOver, Button.prototype.setRollOver);

таким образом ДЛЯ ВСЕХ кнопок, всегда при роллОвере будет срабатывать rollOverCursor...
если где-нить в скриптах будет определена функция onRollOver, то она будет выполняться после настройки курсора.

теперь остается в тело функции rollOverCursor внести действия с представителем твоего класса mouseClass...

GrooveSonic
26.10.2002, 12:18
Гм.. интересную фишку выяснил. Если написать функцию для онРоллОвер и привязать ее к

кнопке, расположив код в фрэйме, как ты написал в предыдушем фржйме, то моя конструкция действительно не

работает. НО(!!) если привязать код обработчика событии прямо к кнопке используя on(rollOver)

{ ... }, то все прекрасно пашет. Получается, что есть разница между этими двумя подходами к

привязывания обработчика событии. Но это так, к слову, щас пойду пробовать то, что ты написал щас.
А вообще ты брат молодец, не потому, что ты много чего знаешь, а потому что ленишься этим делится людям. Респект.!

Если не влом поделись литературкой о недокументированых вохможностей. :-) Можно на мыло, если хочешь.

groovesonic@vida.ru

Спасибо за все.

GrooveSonic
26.10.2002, 12:47
Осознал -> Здорово.
Ключевым моментом является то, что каждый раз когда возникает какое либо событие, то автоматический вызывается его геттер, так? Это справедливо для всех событии?

Главный глюк исправен, теперь надо подумать, как быть с theTarget, но это я пожалуй сам :-)

Nox Noctis
27.10.2002, 02:38
Оригинал написал(а) GrooveSonic
Все что ты написал не лишено смысла
польщен, тронут :D

Оригинал написал(а) GrooveSonic
НО(!!) если привязать код обработчика событии прямо к кнопке используя on(rollOver) гениально =))
открою страшную тайну... только никому ни слова... ЛЮБОЕ событие определенное в onClipEvent или on работает автономно относительно соответствующих событий определенных при помощи присвоения функций =)
(например, если обработчик определен и так и так - то событие будет обрабатываться дважды =) )

Оригинал написал(а) GrooveSonic
автоматически вызывается его геттер
геттер вызывается всякий раз, когда происходит обращение (чтение) к свойству, добавленного при помощи addProperty...
в качестве с"войства" в данном случае метод onRollOver...
запуск функции - тоже операция чтения.
потому сначала вызывается геттер, от него получается ссылка на вызываемую функцию, происходит вызов полученной ссылки...

GrooveSonic
27.10.2002, 12:09
открою страшную тайну... только никому ни слова...

:D окэй, базара нет, унесу с собой в могилу. Кстати, как я выяснил, сначало вызывается код из on(), а потом уже тот, что привязан к onRollOver.

кстати раскрой секрет строчки кода

ASSetpropflags(Button.prototype, ["getRollOver", "setRollOver"], 7);
Что с ней, что без нее все равно работает :) А это не порядок брат, все должно быть четко.

Nox Noctis
28.10.2002, 02:29
ASSetPropFlags (http://chattyfig.figleaf.com/flashcoders-wiki/index.php?ASSetPropFlags)(Button.prototype, ["getRollOver", "setRollOver"], 7);

делает новые методы класса Button - getRollOver и setRollOver

- неизменяемыми (рид онли),
- нестираемыми,
- невидимыми,
- несгораемыми,
- ударопрочными,
- водонепроницаемыми,
- несодержащими искусственных красителей и консервантов =)

естессно без этой строчки все работает - но делать все нужно надежно и как можно более дуракоустойчиво,
служебные методы нужно прятать =)

GrooveSonic
28.10.2002, 10:32
ну что сказать, спасибо... за саппорт и урл ;)

fiza
28.10.2002, 22:56
to Nox Noctis.

Уважаемый, если не очень сложно ответьте на один мааааленький вопросик...

здесь:
Button.prototype.setRollOver = function(newFunction) {
this.rollOver = newFunction;
};

rollOver - просто произвольное название метода?
т.е. я могу заменить его везьде на rollOverBlaBla?
или я таки глубоко заблуждаюсь?

Nox Noctis
29.10.2002, 01:20
да, точно =)

то есть мы делаем такую весчь:
создаем onRollOver - один раз и навсегда,
который вызывает две функции -
собсно роллОвер (ну, или как там его назвать - абсолютно не важно)
плюс функцию настройки курсора...

а чтобы после инициализации такого класса можно было пользоваться присвоением кнопкам онРоллОверов как обычно -
делаем геттер/сеттер свойство, которое при чтении дает ту заготовленную заранее функцию,
а при записи - сохраняет ссылку под другим, отличным от названия "онРоллОвер" именем

fiza
29.10.2002, 03:29
спасибо...
а то меня подсветка во флеше смутила :)

Nox Noctis
29.10.2002, 10:08
ааа.... просто "роллОвер" - это название события... =)

когда пишешь на кнопке

on (rollOver) {
....
}

DeliMIter
29.10.2002, 10:51
Нокс, ты еще не помер после всего вышесказанного?

Nox Noctis
29.10.2002, 11:43
да я и до этого... не очень живой был... =)