2013-10-14 3 views
0

Я проходящее некоторые параметры каждый раз, когда я нажимаю мувиклип, и я, не понимая, как удалить егоУдалить функцию событий, передает параметры

my_mc.addEventListener(MouseEvent.CLICK, someFunct(1,1)); 

Я думал, что это может работать, но это не так работает ...

my_mc.removeEventListener(MouseEvent.CLICK, someFunct) 
+0

Какая ошибка вы получаете. Скорее то, что не работает, что вы думаете, должно работать. BTW, 'someFunct (1,1)' в addEventListener и 'someFunct' в removeEventListener кажется подозрительным !! – catholicon

+0

Нет ошибки вообще, она просто не удаляет слушателя ... – user2624407

ответ

0

Я не думаю, что синтаксис вы вывесили на самом деле работает, если сам someFunct не возвращает функцию, которая является фактическим слушателя событий (за исключением является то, что Flex имеет некоторые вещи под капотом, что создаст иллюзию, что вы можете это сделать). В любом случае, у вас есть более или менее анонимная функция, если она работает удаленно, как отправлено.

Единственное место, где вы можете удалить анонимную функцию, находится внутри слушателя. Тем не менее, слушатель должен иметь более обычную подпись слушателя событий (иметь единственный параметр, который является событием). Если предположить, что где-то в вашем коде есть кто-то, что выглядит так:

protected function someFunct(param1:int, param2:int):void { 
    return function(e:MouseEvent):void { 
     e.target.removeEventListener(e.type, arguments.callee); 
     trace('in listener', param1, param2); 
    } 

}

Если вы используете Flex, я не думаю, что есть способ, чтобы получить туда, где анонимная функция создана, чтобы позволить слушателю быть удален. Подробнее о том, как работает этот материал, попробуйте прочитать this.

+0

ofc возвращает функцию ... но я ищу способ удалить этого слушателя без большой работы. D: – user2624407

+0

Вам понадобится использовать именованную функцию вместо анонимной функции, если вы хотите удалить ее вне самого прослушивателя. Или вы можете уничтожить my_mc и удалить его со сцены. Когда будет собран мусор, закрытие будет также. –

0

Я провел некоторое тестирование и понял, как это сделать. Ниже приведен главный файл test .as, просто сделайте его основным классом документа нового файла .fla и запустите его. Вы можете ясно видеть, как он работает. Что касается вашего урона, вы можете просто заменить this.stage на ваш мувиклип.

package { 
import flash.display.MovieClip; 
import flash.events.MouseEvent; 

public class Main extends MovieClip { 
    public function Main() { 
     graphics.beginFill(0x000000, 1); 
     this.stage.addEventListener(MouseEvent.CLICK, someFunct(1, 1)); 
    } 
    private function someFunct(p1:int, p2:int):Function { 
     return someFunct2 
    } 
    private function someFunct2(event:MouseEvent):void { 
     graphics.drawCircle(this.stage.mouseX, this.stage.mouseY, 50); 
     this.stage.removeEventListener(MouseEvent.CLICK, someFunct2) 
    } 
} 
} 

Если это не ответили на ваш вопрос, пожалуйста, прокомментируйте или отредактируйте ваш вопрос и уточните, что вы действительно хотите. Thank You

1

Try stopImmidiatePropagation(); Он остановит все evnts

Надеюсь, это поможет

Смежные вопросы