Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: addEventListener - dodawanie zdarzenia na początek.
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
erix
Kolejne trudne pytanie, na które prawdopodobnie nie otrzymam odpowiedzi, ale spróbować zawsze można. biggrin.gif

Mianowicie - w jaki sposób dodać zdarzenie przez addEventListener dla danego elementu na początek kolejki zdarzeń, a nie na jej koniec?

Piszę UserJS-a i potrzebuję wykonać swoją funkcję zanim fabryczny handler zostanie wykonany, a nie ma sensu reimplementować istniejącej funkcjonalności.

Jakieś pomysły?
wookieb
Metoda addEventListener nie wspiera takiego rozwiązania. Opcją jest np podpięcie zdarzenia do elementu rodzica
[JAVASCRIPT] pobierz, plaintext
  1. function f1()
  2. {
  3. console.log('p');
  4. }
  5. function f2()
  6. {
  7. console.log('d');
  8. }
  9.  
  10. var element = document.getElementById('cholera');
  11. element.addEventListener('click', f1, true);
  12. element.parentNode.addEventListener('click', f2, true);
[JAVASCRIPT] pobierz, plaintext
vokiel
Przepisać to do tempowego elementu, dodać swój i dopisać to z temp'a?

Możesz sprawdzać co już jest podpięte korzystając z eventListenerList i usuwać przez removeEventListener()
erix
~vokiel - http://stackoverflow.com/questions/2424737...-implementation - więc trzeba zapomnieć. sad.gif

~wookieb - no tak, ale sęk w tym, że zdarzenie rodzica zostanie wykonane po zdarzeniu dziecka. Więc odpada, bo moje zdarzenie musi zostać wykonane przed fabrycznymi.

Huh, zapomniałem, że użyłeś capture; zobaczymy, jak w praniu wyjdzie.
wookieb
Jak testowałem to działało. Niestety jak się domyślasz nie zadziała to w każdym typie zdarzeń albo obiektach które nie mają rodzica.
Crozin
Dla jakiej przeglądarki piszesz tego UserJS? Opera udostępnia kilka narzędzi pozwalających zrobić trochę magii w JS-cie strony, GreaseMonkey o ile dobrze kojarzę też.
erix
No właśnie pod Operę to piszę, tylko do jakiej konkretnie funkcji pijesz? magicFunction/magicVariable mi nie pomoże. [;
zegarek84
Cytat(erix @ 23.08.2010, 21:46:53 ) *
...Piszę UserJS-a i potrzebuję wykonać swoją funkcję zanim fabryczny handler zostanie wykonany, a nie ma sensu reimplementować istniejącej funkcjonalności.

Jakieś pomysły?
Cytat(erix @ 24.08.2010, 10:05:20 ) *
No właśnie pod Operę to piszę...
Jedno z rozwiązań podał vokiel... ale co masz na myśli przez sformułowanie "fabryczny handler" - czy masz na myśli podpięte zdarzenie przez skrypt znajdujący się na stronie?? W operze o tyle jest wygodnie, że można załączać userscript'y na 2 sposoby - z podwójnym rozszerzeniem jak w Greasemonkey [skrypt wykonuje się po załadowaniu dokumentu - nie pamiętam kture ze zdarzeń wtedy zachodzi] lub z samym rozszerzeniem *.js - i tutaj już pasuje wykrywać zdarzenia typu "DOMContentLoaded"... skrypty urzytkownika w przypadku *.js są wcześniej w oknie więc jest spora szansa podpiąć pierwszemu swoje zdarzenia [podpinając na starcie wykrycie zdarzenia załadowanego dokumentu po czym podpięcie swojego zdarzenia w pierwszej kolejności...] - no jeszcze można trafić na szybsze wywołanie funkcji w dokumencie już po załadowaniu dokumentu - gdy funkcja startująca jest za zamykającym tagiem </html>...

[edit]
lub jeszcze skoro skrypty *.js są zanim dokument się załaduje, to można sprawdzić, czy gdy document się ładuje, czy jest inicjowane zdarzenie typu DOMNodeInserted lub DOMNodeInsertedIntoDocument i jeśli tak to po każdym takim zdarzeniu sprawdzić, czy jest już wymagany element w dokumencie...
erix
Cytat
Jedno z rozwiązań podał vokiel... ale co masz na myśli przez sformułowanie "fabryczny handler"

A czytałeś linka, który zamieściłem wcześniej?

Cytat
ale co masz na myśli przez sformułowanie "fabryczny handler" - czy masz na myśli podpięte zdarzenie przez skrypt znajdujący się na stronie??

Yup.

Cytat
lub jeszcze skoro skrypty *.js są zanim dokument się załaduje, to można sprawdzić, czy gdy document się ładuje, czy jest inicjowane zdarzenie typu DOMNodeInserted lub DOMNodeInsertedIntoDocument i jeśli tak to po każdym takim zdarzeniu sprawdzić, czy jest już wymagany element w dokumencie...

Huh, pod tym kątem nie pomyślałem. Tylko że nie DOMNodeInserted, tylko trzeba będzie dopiąć przez beforeScript. smile.gif

Dzięki, oświeciłeś mnie. smile.gif

ps. pomógły polecą, jak sprawdzę w działaniu. Przetestuję oba rozwiązania. winksmiley.jpg
zegarek84
Cytat(erix @ 24.08.2010, 13:39:47 ) *
A czytałeś linka, który zamieściłem wcześniej?
mam problemy z netem [radiówka i kiepska pogoda - ale już zerknąłem ^^]
co przez google mi się przewinęło [przy tym necie na strony nie wchodziłem] to jest to na 99% zaimplementowane do greasemonkey - ale zapomnijmy o tym...
Cytat(erix @ 24.08.2010, 13:39:47 ) *
Huh, pod tym kątem nie pomyślałem. Tylko że nie DOMNodeInserted, tylko trzeba będzie dopiąć przez beforeScript. smile.gif

Dzięki, oświeciłeś mnie. smile.gif

dawno nie grałem więc dawno dla siebie i znajomych nie pisałem automatów... i tego beforeScript chyba wcześniej też nie było - z ciekawości luknąłem na stronę opery i mnie rozwaliło - SKORO ZNASZ TO ZDARZENIE TO POWINIENEŚ ZNAĆ BANALNIEJSZĄ METODĘ ;D

szkoda się rozpisywać i przede wszystkim przeczytaj całą stronę tam:
User JavaScript - Examples of use od Loading scripts [czyli to o czym teraz napisałeś] w dół...

w operze w userscript masz takie metody jak:
BeforeEvent.type
BeforeEventListener.type

i nie interesujące Cię AfterEvent.type ;D
po problemie winksmiley.jpg
erix
Cytat
luknąłem na stronę opery i mnie rozwaliło - SKORO ZNASZ TO ZDARZENIE TO POWINIENEŚ ZNAĆ BANALNIEJSZĄ METODĘ ;D

No tak, ale lepiej było też poznać metodę opartą na czystym JS, a nie wyłącznie na API do UserJS.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.