Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как удалить слушатели событий (http://www.flasher.ru/forum/showthread.php?t=205613)

BAXTER 11.12.2013 20:23

Как удалить слушатели событий
 
Вложений: 1
Нужна помощь. Есть несколько кнопок класса MainButton созданные циклом.
В классе MainButton к каждой кнопке крепится слушатель.

Как мне удалить слушатели всех этих кнопок, после клика на любую кнопку?

Знаю что есть dispatchEvent, но как сразу удалить ВСЕ слушатели кнопок, а не только по какой делаешь клик?

Dip52 11.12.2013 20:44

Код AS3:

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
Код AS3:

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]);
    }
}

Можно так же повесить два слушателя на кнопку, один для обработки нажатия, а второй для отписывания от события:
Код AS3:

...
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]);
    }
}

И совет - не пишите все таки в кадрах..

BAXTER 11.12.2013 21:19

Огромное спасибо! Вроде все просто, буду пробовать.

caseyryan 11.12.2013 22:31

BAXTER, не нужно вставлять сюда скриншоты. Копируйте свой код и обрамляйте его тегами AS3. Думаете кому-то хочется перенабирать все это вручную, чтобы исправить у вас какую-то ошибку?

BAXTER 12.12.2013 03:26

no problem. Хотел как лучше


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

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