Oto mój problem: czy można w jakiś sposób sprawdzić, czy istnieje dynamicznie dołączany detektor zdarzeń? Albo jak mogę sprawdzić stan właściwości „onclick” (?) W DOM? Szukałem rozwiązania w Internecie, podobnie jak Stack Overflow, ale bez powodzenia. Oto mój html:
<a id="link1" onclick="linkclick(event)"> link 1 </a>
<a id="link2"> link 2 </a> <!-- without inline onclick handler -->
Następnie w Javascript dołączam dynamicznie utworzony detektor zdarzeń do drugiego linku:
document.getElementById('link2').addEventListener('click', linkclick, false);
Kod działa dobrze, ale wszystkie moje próby wykrycia tego dołączonego nasłuchiwania kończą się niepowodzeniem:
// test for #link2 - dynamically created eventlistener
alert(elem.onclick); // null
alert(elem.hasAttribute('onclick')); // false
alert(elem.click); // function click(){[native code]} // btw, what's this?
jsFiddle jest tutaj . Jeśli klikniesz „Dodaj onclick dla 2”, a następnie „[link 2]”, zdarzenie zostanie uruchomione dobrze, ale „Testuj link 2” zawsze zgłasza fałsz. Czy ktoś może pomóc?
Odpowiedzi:
Nie ma możliwości sprawdzenia, czy istnieją dynamicznie dołączone nasłuchiwania zdarzeń.
Jedynym sposobem sprawdzenia, czy odbiornik zdarzeń jest dołączony, jest dołączenie detektorów zdarzeń w następujący sposób:
Następnie możesz sprawdzić, czy odbiornik zdarzeń został dołączony
onclick
, zwracając!!elem.onclick
(lub coś podobnego).źródło
Zrobiłem coś takiego:
Utworzenie specjalnego atrybutu dla elementu, gdy jest dołączony detektor, a następnie sprawdzenie, czy istnieje.
źródło
To, co zrobiłbym, to utworzenie wartości logicznej poza twoją funkcją, która zaczyna się jako FALSE i jest ustawiana na TRUE po dołączeniu zdarzenia. Będzie to służyć jako flaga przed ponownym załączeniem wydarzenia. Oto przykład pomysłu.
źródło
Możliwy duplikat: sprawdź, czy element ma nasłuchiwanie zdarzeń. Brak jQuery Proszę znaleźć tam moją odpowiedź.
Zasadniczo tutaj jest sztuczka dla przeglądarki Chromium (Chrome):
źródło
tl; dr : Nie, nie możesz tego zrobić w żaden natywnie obsługiwany sposób.
Jedynym sposobem, jaki znam, aby to osiągnąć, byłoby utworzenie niestandardowego obiektu pamięci, w którym będziesz przechowywać rejestr dodanych słuchaczy. Coś w następujący sposób:
Krok 1: Po pierwsze, będziesz potrzebować funkcji, która może przejść przez obiekt pamięci i zwrócić rekord elementu podanego elementu (lub false).
Krok 2: Następnie będziesz potrzebować funkcji, która może dodać odbiornik zdarzeń, ale także wstawić go do obiektu pamięci.
Krok 3: Jeśli chodzi o faktyczne wymaganie twojego pytania, będziesz potrzebować następującej funkcji, aby sprawdzić, czy element został dodany jako detektor zdarzeń dla określonego zdarzenia.
Krok 4: Na koniec będziesz potrzebować funkcji, która może usunąć nasłuchiwanie z obiektu pamięci.
Skrawek:
Pokaż fragment kodu
Chociaż minęło ponad 5 lat od opublikowania tego pytania w PO, uważam, że osoby, które natkną się na to pytanie w przyszłości, skorzystają na tej odpowiedzi, więc zachęcamy do zgłaszania sugestii lub ulepszeń do niej. 😊
źródło
Zawsze możesz sprawdzić ręcznie, czy Twój EventListener istnieje, na przykład za pomocą inspektora Chrome. W zakładce Element znajduje się tradycyjna karta podrzędna „Style”, a obok niej kolejna: „Detektory zdarzeń”. Co da ci listę wszystkich EventListenerów z połączonymi z nimi elementami.
źródło
Wydaje się dziwne, że ta metoda nie istnieje. Czy czas wreszcie to dodać?
Jeśli chcesz, możesz coś takiego:
źródło
Oto skrypt, którego użyłem do sprawdzenia, czy istnieje dynamicznie dołączony detektor zdarzeń. Użyłem jQuery, aby dołączyć procedurę obsługi zdarzeń do elementu, a następnie wyzwolić to zdarzenie (w tym przypadku zdarzenie „kliknięcie”). W ten sposób mogę pobrać i przechwycić właściwości zdarzenia, które będą istnieć tylko wtedy, gdy jest dołączony program obsługi zdarzeń.
źródło
Wygląda na to, że nie istnieje funkcja między przeglądarkami, która wyszukuje zdarzenia zarejestrowane w ramach danego elementu.
Możliwe jest jednak przeglądanie funkcji wywołania zwrotnego dla elementów w niektórych przeglądarkach za pomocą ich narzędzi programistycznych. Może to być przydatne podczas próby ustalenia, jak działa strona internetowa lub do debugowania kodu.
Firefox
Najpierw wyświetl element na karcie Inspektor w narzędziach programistycznych. To może być skończone:
Jeśli jakieś zdarzenia zostały zarejestrowane w elemencie, zobaczysz przycisk zawierający słowo Event obok elementu . Kliknięcie go pozwoli Ci zobaczyć zdarzenia, które zostały zarejestrowane z elementem. Kliknięcie strzałki obok zdarzenia umożliwia wyświetlenie odpowiadającej mu funkcji wywołania zwrotnego.
Chrom
Najpierw wyświetl element na karcie Elementy w narzędziach programistycznych. To może być skończone:
W pobliżu sekcji okna wyświetlającego drzewo zawierające elementy strony internetowej powinna znajdować się kolejna sekcja z zakładką zatytułowaną „Detektory zdarzeń”. Wybierz, aby zobaczyć zdarzenia, które zostały zarejestrowane w elemencie. Aby zobaczyć kod dla danego wydarzenia, kliknij link po jego prawej stronie.
W przeglądarce Chrome zdarzenia dla elementu można również znaleźć za pomocą funkcji getEventListeners . Jednak na podstawie moich testów funkcja getEventListeners nie wyświetla zdarzeń, gdy przekazywanych jest do niej wiele elementów. Jeśli chcesz znaleźć wszystkie elementy na stronie, które mają detektory, i wyświetlić funkcje wywołania zwrotnego dla tych detektorów, możesz to zrobić za pomocą następującego kodu w konsoli:
Edytuj tę odpowiedź, jeśli wiesz, jak to zrobić w danych przeglądarkach lub innych przeglądarkach.
źródło
Właśnie się o tym dowiedziałem, próbując sprawdzić, czy moje wydarzenie było dołączone ....
Jeśli zrobisz :
zwróci „null”
ale jeśli to zrobisz:
to jest „PRAWDA”
więc myślę, że kiedy używasz „addEventListener” do dodawania programów obsługi zdarzeń, jedynym sposobem na dostęp do nich jest „hasOwnProperty”. Chciałbym wiedzieć, dlaczego i jak, ale niestety, po przeprowadzeniu badań, nie znalazłem wyjaśnienia.
źródło
onclick
jest odrębny od.addEventListener
- wpływa na atrybut, podczas gdy.addEventListener
nieJeśli dobrze rozumiem, możesz tylko sprawdzić, czy słuchacz został sprawdzony, ale nie, który słuchacz jest konkretnie prezenterem.
Więc jakiś kod ad hoc wypełni lukę w obsłudze przepływu kodowania. Praktyczną metodą byłoby utworzenie
state
przy użyciu zmiennych. Na przykład dołącz kontroler słuchacza w następujący sposób:wtedy jeśli ustawisz odbiornik, po prostu zmień wartość:
następnie wewnątrz wywołania zwrotnego eventListener możesz przypisać określone funkcje wewnątrz iw ten sam sposób rozdzielić dostęp do funkcjonalności w zależności od stanu jako zmiennej, na przykład:
źródło
Po prostu usuń wydarzenie przed jego dodaniem:
źródło
Właśnie napisałem skrypt, który pozwala ci to osiągnąć. Daje ci dwie globalne funkcje:
hasEvent(Node elm, String event)
igetEvents(Node elm)
którą możesz wykorzystać. Należy pamiętać, że modyfikujeEventTarget
metodę prototypowąadd/RemoveEventListener
i nie działa w przypadku zdarzeń dodanych za pomocą znaczników HTML lub składni javascriptelm.on_event = ...
Więcej informacji na GitHub
Live Demo
Scenariusz:
źródło
Teoretycznie można by zastosować piggyback addEventListener i removeEventListener, aby dodać, usunąć flagę z obiektu „this”. Brzydki i nie testowałem ...
źródło