Czy istnieje sposób określenia, które detektory zdarzeń są zarejestrowane w obiekcie wyświetlanym? Chcę usunąć wszystkie detektory zdarzeń z obiektu wyświetlanego, aby móc przypisać nowe na podstawie zmian kontekstu w aplikacji.Jak usunąć wszystkie detektory zdarzeń z obiektu wyświetlanego?
Odpowiedz
jeceuyper ma rację ...
boczny nie choć: DisplayObject
rozciąga EventDispatcher
, który już ma realizować IEventDispatcher
... tak, aby być bardziej precyzyjnym: trzeba zastąpić addEventListener
i removeEventListener
śledzić słuchaczy ...
kilka szczegółów technicznych: proponuję użyć Dictionary
do przechowywania funkcji obsługi ... nieco wolniej do wstawiania, ale znacznie szybciej do usunięcia ... również, Dictionary
obsługuje słabe referencje, co jest dość ważne w przypadku obsługi zdarzeń ... pamiętaj także, że useCapture
umożliwia dodanie obsługi tego samego dwa razy ...
szczęście potem ...;)
Dzięki za wskazanie, że na back2dos! – jdecuyper
Glenn ma rację, nie ma czegoś takiego jak metoda removeAllListener lub listAllListener. Mimo to można uczynić custum diplayObject implementować interfejs IEventDispatcher i śledzić wszystkich detektorów dodanych lub usuniętych z obiektu.
back2dos wspomniał podejście należy użyć, co zrobiłem, było rozszerzenie klasy MovieClip i wdrożone wszystkie rodzaje funkcji które używam codziennie, ale nie są częścią klasy movieclip. łącznie z ręcznym dla klasy addEventListener
protected var listeners : Dictionary = new Dictionary();
override public function addEventListener(type : String, listener : Function, useCapture : Boolean = false, priority : int = 0, useWeakReference : Boolean = true) : void
{
var key : Object = {type:type,useCapture:useCapture};
if(listeners[ key ]) {
removeEventListener(type, listeners[ key ], useCapture);
listeners[ key ] = null;
}
listeners[ key ] = listener;
super.addEventListener(type, listener, useCapture, priority, useWeakReference);
}
protected function removeListeners() : void
{
try
{
for (var key:Object in listeners) {
removeEventListener(key.type, listeners[ key ], key.useCapture);
listeners[ key ] = null;
}
}catch(e:Error){}
}
... z wyjątkiem włączenia typu do klucza bez włączenia wskaźnika funkcji oznacza, że na obiekcie może znajdować się tylko jeden obiekt nasłuchujący danego typu. Aby umożliwić wielu detektorów, dodaj wskaźnik funkcji detektora do obiektu klucza i po prostu ustaw ten klucz na jakąś fałszywą wartość (np. 1). –
Jest to rodzaj hack, ale w niektórych (być może w większości przypadków), można łatwo ustawić obiekt wyświetlany na null i ponownie zainicjować go, a następnie ponownie go skonfigurować z zerowym wizualnym zakłóceniem.
Ma to dodatkową zaletę polegającą na usunięciu wszystkich detektorów zdarzeń.
Jeśli nie robisz tego w aplikacji, która ma już setki obiektów i słuchaczy, powinna działać idealnie dobrze, o ile możesz znieść rekonfigurację obiektu wyświetlanego.
Oczywiście nie powinieneś robić tego na czymś, co robi coś szalonego w konstruktorze, jak ładowanie danych.
function a(){
mc.addEventListener(Event.ENTER_FRAME,function(){
...
}
}
function b(){
mc.removeEventListener(Event.ENTER_FRAME,function(){});
}
działa ...
Przeczytaj uważnie to pytanie. Zapytałem, jak usunąć WSZYSTKIE detektory zdarzeń z obiektu. – Soviut
Właściwie to tylko patrzyłem na to pytanie, aby rozwiązać ten problem. – andychase
To nie zadziała - anonimowa funkcja obsługi zdarzeń utworzona w ramach "funkcji b" jest innym obiektem niż anonimowa funkcja obsługi zdarzenia utworzona w ramach funkcji "funkcja a". Dlatego wywołanie 'removeEventListener' zakończy się po cichu. – ericsoco
- 1. Jak działają detektory zdarzeń?
- 2. Zdarzenia Java i detektory zdarzeń
- 3. Jak usunąć wszystkie obiekty z obiektu NSMutableArray?
- 4. Jak dodać detektory zdarzeń do tablicy obiektów
- 5. Gdzie umieszczam detektory zdarzeń i procedury obsługi?
- 6. Jak dodać detektory zdarzeń do obiektów w svg?
- 7. : Jak znaleźć detektory zdarzeń w węźle DOM w prototypie?
- 8. Jak znaleźć detektory zdarzeń w węźle DOM przy użyciu JavaScriptu
- 9. Jak usunąć właściwość z obiektu?
- 10. Jak usunąć siebie z obsługi zdarzeń?
- 11. Jak usunąć obsługę zdarzeń z instancji JWPlayer?
- 12. Jak usunąć obsługi zdarzeń lambda
- 13. Get detektory zdarzeń dołączone do węzła za pomocą addEventListener
- 14. Jak usunąć tylko jedną instancję obiektu z obiektu NSMutableArray?
- 15. Czy jQuery usuwa detektory zdarzeń ze zniszczonej zawartości DOM?
- 16. Czy detektory zdarzeń w jQuery są usuwane automatycznie po usunięciu elementu za pomocą .html()?
- 17. Jak usunąć wszystkie relacje z wielutoma?
- 18. Jak usunąć wszystkie znaki z ciągu znaków?
- 19. Jak usunąć wszystkie wiersze z siatki Kendo
- 20. Jak usunąć wszystkie pliki cookie z jQuery
- 21. Jak usunąć wszystkie zadania z sidekiq?
- 22. Jak usunąć wszystkie tagi komentarzy z XmlDocument
- 23. Jak usunąć wszystkie usunięte pliki z repozytorium?
- 24. Jak usunąć wszystkie NA z wektora?
- 25. Jak usunąć wszystkie znaki diakrytyczne z pliku?
- 26. Jak usunąć wszystkie zdarzenia w MySQL
- 27. Jak usunąć właściwość z obiektu Emberjs?
- 28. Jak usunąć element z obiektu IGrouping
- 29. Jak usunąć atrybut z obiektu MongoDb?
- 30. Jak usunąć wszystkie klawisze resharper?
Zasadniczo dupe z tym jednym, wcześniej zalogowany dziś: http://stackoverflow.com/questions/1452539/flash-as3-eventdispatcher-any-way-of-getting -a-lista-zarejestrowanych-słuchaczy – Glenn
Ale krótka odpowiedź brzmi: musisz zarządzać własną przy użyciu mapy hash lub czegoś podobnego. – Glenn