Просмотр полной версии : Можно ли изменить порядок слушателей?
Собственно сабж. Есть несколько слушателей на одно и то же событие, однако вот казус, как показал тест сначала выполняется последний слушатель, а потом по порядку все остальные, т.е. в обратном порядке относительно их добавления. Не понятно для чего это сделано. Было бы логично сначала тот который первый добавлен, а потом все по порядку, однака у флэша своя логика...
А что используется в качестве вещателя?
motor4ik
20.10.2006, 18:58
Stage, обрабатывает подрят , но всеровно как поменять? просто переприсвоить?
Тогда сделать массив слушателей, отсортировать как нужно и пробежаться по нему, подписывая элементы на Stage.
А почему вы считаете что это логично? Для вас удобно так, а для других как есть. Не надо личные желания выдавать за общие.
Собственно сабж. Есть несколько слушателей на одно и то же событие, однако вот казус, как показал тест сначала выполняется последний слушатель, а потом по порядку все остальные, т.е. в обратном порядке относительно их добавления. Не понятно для чего это сделано. Было бы логично сначала тот который первый добавлен, а потом все по порядку, однака у флэша своя логика...
да как бы так(т.е. в порядке добавления) и есть:
var l1={onResize:function(){trace("1")}};
var l2={onResize:function(){trace("2")}};
Stage.addListener(l1);
Stage.addListener(l2);
//при ресайзе выдет 1, 2 т.е. в порядке добавления
//перетасуем
//Stage["_listeners"].reverse();//2, 1 : в обратном порядке
смотри внимательнее как/когда добавляешь..
silin, ну это же хак =)
Лучше легально изменять список.
Или сделать что-то типа интерфейса к Stage, класс, который является вещателем и сам подписан на Stage и при onResize шлёт всем своим подписчикам событие onResize.
К примеру, мой StageManager (http://dev.etcs.ru/blog/as2/ru/etcs/utils/stagemanager/).
да как бы так(т.е. в порядке добавления) и есть:
var l1={onResize:function(){trace("1")}};
var l2={onResize:function(){trace("2")}};
Stage.addListener(l1);
Stage.addListener(l2);
//при ресайзе выдет 1, 2 т.е. в порядке добавления
//перетасуем
//Stage["_listeners"].reverse();//2, 1 : в обратном порядке
смотри внимательнее как/когда добавляешь..
Странно, пробовал для теста весить на мх кнопарь несколько слушателей на "click" - выполняются в обратном порядке, может из-за
addEventListener ?
DeniOR, addEventListener используется в EventDispatcher, но там, как такового, нет массива слушателей, там используется объект.
vooparker
20.10.2006, 19:44
2DeniOR: _etc тебе дело говорит - это будет самый правильный вариант
Странно, пробовал для теста весить на мх кнопарь несколько слушателей на "click" - выполняются в обратном порядке, может из-за
addEventListener ?
ага, для компонентов массив перебирается в обратном порядке, потому как for (i in ..) вместо for(i=0;i<;i++), зачем/почему? удобнее так было, наверное..:)
var l1={click:function(){trace(1)}};
var l2={click:function(){trace(2)}};
but.addEventListener("click",l1);
but.addEventListener("click",l2);
//2,1
//но инвертировать/отсортировать тоже не вопрос
//but.__q_click.reverse();//1,2
2__etc: хак хаком, но я исхожу из того, что прежде чем замахиваться на проекты, где потребуется кристально чистый код, неплохо разобраться как оно вообще работает..:)
хак хаком, но я исхожу из того, что прежде чем замахиваться на проекты, где потребуется кристально чистый код, неплохо разобраться как оно вообще работает..:)
Я имел ввиду, что необходимо предупредить об этом и что юзать это в кач. примера не стоит.
2 silin: Спасибо за исчерпывающий ответ
Вот еще забавная картинка получается:
var l1={click:function(){trace(1)}};
var l2={click:function(){trace(2)}};
var l3={click:function(){trace(3)}};
var l4={click:function(){trace(4)}};
but.addEventListener("click",l1);
but.addEventListener("click",l2);
but.addEventListener("click",l3);
but.addEventListener("click",l4);
//результат: 4,3,2,1
//инвертируем:
//but.__q_click.reverse();//результат: 2,3,1,4
Казалось бы все должно получится, ан нет...
И еще а по какому признаку сортировать можно слушателей? Они же объекты. Хотелось бы их отсортировать по добавлению, чтоб первый был первым и т.д.
да, непонятка..
как вариант: добавить листенерам специальное поле и сортировать по нему:
var l1={click:function(){trace(1)},tag:1};
var l2={click:function(){trace(2)},tag:2};
var l3={click:function(){trace(3)},tag:3};
var l4={click:function(){trace(4)},tag:4};
but.addEventListener("click",l1);
but.addEventListener("click",l2);
but.addEventListener("click",l3);
but.addEventListener("click",l4);
but.__q_click.sortOn("tag",2);
1,2,3,4
2silin: Спасибо, попробую...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.