Просмотр полной версии : Как удалить слушатели событий
Нужна помощь. Есть несколько кнопок класса MainButton созданные циклом.
В классе MainButton к каждой кнопке крепится слушатель.
Как мне удалить слушатели всех этих кнопок, после клика на любую кнопку?
Знаю что есть dispatchEvent, но как сразу удалить ВСЕ слушатели кнопок, а не только по какой делаешь клик?
var buttons:Array = []; //Массив кнопок:
private function removeAllButtons():void
{
const LENGTHBUTTONS:int = buttons.length;
for(var i:int = 0; i < LENGTHBUTTONS; i++)
{
const BUTTON:MovieClip = buttons[i];
BUTTON.removeEventListener(MouseEvent.CLICK,onCLICK);
}
}
KumoKairo
11.12.2013, 21:02
Dip52, ваш код будет пытаться отписывать несуществующий слушатель. Слушателей вы удаляете в родителе, поэтому функция с названием onCLICK будет искаться в самом родителе, а не в кнопке. А нужно отписывать тот метод, который действительно подписан, то есть BUTTON.onCLICK. Но onClick - приватный метод, к нему нет доступа из родителя.
Знаю что есть dispatchEvent
dispatchEvent - это диспетчеризация события, а не удаление слушателя.
Короче, я предлагаю сделать так
У вас в коде один существенный недстаток - каждая кнопка хранит в себе логику обработки нажатий других кнопок. Это, во-первых, здорово запутывает, а во-вторых усложняет работу с бОльшим количеством кнопок (для каждой новой кнопки придется лезть в класс и добавлять еще один case.
Добавлять событие нажатия на кнопку тоже лучше в родителе, который эти кнопки на себя вешает (на экран).
Я бы советовал пересмотреть общую структуру кода и сделать так:
Класс кнопки вообще убирайте, использовать будем только SimpleButton
var buttonsArray:Array = new Array();
var listenersArray:Array = [button1Listener, button2Listener]; //Массив со слушателями, допустим что у нас 2 кнопки
//Тут ваш позишн еррей
for(var i:int = 0; i < positionArray.length; i++)
{
var button:SimpleButton = new SimpleButton();
//выставляем позишн, добавляем на экран и тд, а потом:
button.addEventListener(MouseEvent.CLICK, listenersArray[i]);
buttonsArray.push(button);
}
function button1Listener(e:MouseEvent):void
{
//код
removeAllListeners();
}
function button2Listener(e:MouseEvent):void
{
//код
removeAllListeners();
}
function removeAllListeners():void
{
for(var i:int = 0; i < listenersArray.length; i++)
{
buttonsArray[i].removeEventListener(MouseEvent.CLICK, listenersArray[i]);
}
}
Можно так же повесить два слушателя на кнопку, один для обработки нажатия, а второй для отписывания от события:
...
for(var i:int = 0; i < positionArray.length; i++)
{
var button:SimpleButton = new SimpleButton();
//выставляем позишн, добавляем на экран и тд, а потом:
button.addEventListener(MouseEvent.CLICK, listenersArray[i]);
button.addEventListener(MouseEvent.CLICK, removeAllListeners);
buttonsArray.push(button);
}
function button1Listener(e:MouseEvent):void
{
//код
}
function button2Listener(e:MouseEvent):void
{
//код
}
function removeAllListeners(e:MouseEvent = null):void
{
for(var i:int = 0; i < listenersArray.length; i++)
{
buttonsArray[i].removeEventListener(MouseEvent.CLICK, listenersArray[i]);
}
}
И совет - не пишите все таки в кадрах..
Огромное спасибо! Вроде все просто, буду пробовать.
caseyryan
11.12.2013, 22:31
BAXTER, не нужно вставлять сюда скриншоты. Копируйте свой код и обрамляйте его тегами AS3. Думаете кому-то хочется перенабирать все это вручную, чтобы исправить у вас какую-то ошибку?
no problem. Хотел как лучше
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.