Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]składnia zdarzenia ON
Forum PHP.pl > Forum > Przedszkole
smiady
Witam.
Ostatnio zauważyłem, że składnia ON ma dwa zapisy z czego mi działa tylko ten drugi, a pierwszy (ten skrócony) już nie dlaczego ?
Korzystam z najnowszego jQuery.
Ten pierwszy skrócony występuje obecnie na stronie głównej jQuery.

  1. $('.nowy').on('click', function() {
  2. alert('dziala');
  3. });


  1. $('#wrzuc').on('click', '.nowy', function() {
  2. alert('dziala');
  3. });
Sephirus
Hmmm to istnieje już od dłuższego czasu - dokumentacja podaje od wersji 1.7

Tak czy owak tu masz wszystko opisane: http://api.jquery.com/on/ - przeczytaj punkt: "Direct and delegated events"

Coś robisz źle - obie konstrukcje powinny działać bez zarzutu.

Pierwsza dodaje eventhandler do każdego elementu klasy "nowy"

Druga dodaje eventhandler do elementu o id "wrzuc" tak by wylapywal klikanie na elemencie klasy "nowy"

To musi działać...

Nie działać może w momencie gdy robisz coś takiego:

1. Masz pusty element #wrzuc
2. podpinasz event (metoda 1)
taka konstrukcja szuka elementów ".nowy" - których nie znajduje
3. ładujesz jakieś dane do #wrzuc razem z jakimiś elementami ".nowy" - lecz one były wrzucone po fakcie i nie mają podpiętego eventu...

Jak zastosujesz metodę 2:

1. Masz pusty element #wrzuc
2. podpinasz event (metoda 2)
taka konstrukcja podpina event pod sam element #wrzuc dla elementów ".nowy" wewnątrz niego - elementów ".nowy" jeszcze nie ma
3. pojawiają się elementy ".nowy" - klikanie na nie powoduje jakby nie patrzeć klikanie na element w jakim się znajdują - więc na "#wrzuc" - event jest odpalany - sprawdzane jest czy źródłem kliknięcia był element ".nowy" - jeśli tak wszystko działa.

Może tak jest u Ciebie i dlatego Ci to nie działa.
smiady
W teorii wydaje mi się że ten kod jest dobry, ale nie działa. Co jest nie tak ?

  1. <HTML>
  2. <HEAD>
  3. <style>
  4.  
  5. </style>
  6. <script src='jquery-1.10.2.js'></script>
  7. <script>
  8. $(document).ready(function() {
  9.  
  10. $('#przycisk').click(function() {
  11. $("<p class='nowy'>Nowy napis</p>").appendTo('#blok');
  12. });
  13.  
  14. $('.nowy').on('click', function() {
  15. alert('dziala');
  16. });
  17.  
  18. });
  19. </script>
  20. </HEAD>
  21. <BODY>
  22. <div id='blok'>
  23. </div>
  24. <button id='przycisk'>dodaj</button>
  25. </BODY>
  26. </HTML>
lobopol
Nie jest to poprawny kod, on nie zadziała w tym wypadku bo tworzysz nowy element. W wypadku użycia drugiego zapisu zdarzenie jest podpięte bezpośrednio pod istniejący element i każde kliknięcie w niego sprawdza czy nie kliknęło się w jakiegoś potomka elementu spełniającego warunek posiadania klasy.

Aby składnia $('nowy').on działała musiałbyś po stworzeniu elementu dodawać dodawać mu zdarzenie on np.:

[JAVASCRIPT] pobierz, plaintext
  1. $('#przycisk').click(function() {
  2. var $el = $("<p class='nowy'>Nowy napis</p>");
  3. $el.appendTo('#blok');
  4. $el.on('click', function() {
  5. alert('dziala');
  6. });
  7. });
  8.  
  9.  
[JAVASCRIPT] pobierz, plaintext
smiady
Dzięki teraz działa.

Tylko, że w tym przypadku można korzystać ze zwykłego zdarzenia click i też będzie działać. Dla mnie skrócony zapis on trochę jest bez sensu, że trzeba go robić tuż po dodaniu elementu.
lobopol
click to jest alias dla on('click'), a to że musisz go robić po dodaniu to jest po prostu logiczne, nie podepniesz eventa pod nieistniejący element, możesz natomiast podpiąć zdarzenie pod istniejący element nasłuchując na klikanie w potomka.
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.