Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JQuery] Akcja dla dynamicznie tworzonego potomka
gregiolo
post
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.02.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witam serdecznie,
Posiadam następujący, przykładowy kod:

  1. <div id="container">
  2. <div id="rodzic"></div>
  3. </div>


oraz zdarzenie (wstępnie):

  1. $("#rodzic").click(function() {
  2. $(this).append('<div id="losoweid"></div>');
  3. });


Chciałbym aby po kliknięciu na blok #rodzic lub każdy #losoweid i wszystkich zagnieżdżonych w nich lub równoległych poziomem do nich, wykonywała się taka sama akcja jak wyżej czyli tworzenie potomnego bloku. Poziom, w którym byłby dopisany zależałby od klikniętego bloku.

Problem w tym, że gdy nawet zmienię selektor na $("#container > div") gdy klikam na "rodzic" lub "losoweid" wykonuje się automatycznie ta sama akcja dla rodzica. Jednocześnie nie mogę pozbawić rodzica eventu gdyż może się przydać po kliknięciu na niego.

Próbowałem metod:
1) umieszczenia nazwanego eventu click po append() ale nie odczytuje akcji
2) korzystania z funkcji delegate
3) korzystania z funkcji live()
4) korzystania z regexp w selektorze dla wszystkich div, ale wtedy akcja wywołuje się rekurencyjnie do bólu.
5) unbind

Naturalnie nie wchodzi w grę dopisywanie ręczne definicji akcji dla każdego ID.
Fakt, że mogłem rozwiązań j/w użyć nieumiejętnie, więc proszę o pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
everth
post
Post #2





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


Jeśli dobrze kojarzę
[JAVASCRIPT] pobierz, plaintext
  1. $('#rodzic').click(function(e) {
  2. curObj = $(e.currentTarget);
  3. curObj.append('<div id="losoweid"></div>');
  4. });
[JAVASCRIPT] pobierz, plaintext

Dodaj jeszcze warunkowe wykonanie zdarzenia w zależności od rodzaju klikniętego curObj.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
gregiolo
post
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.02.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Hmm pomysł ciekawy, ale niestety nie działa.

Jako selektora użyłem zarówno rodzic jak i wszystkie div'y dzieci.
  1. obj = $(e.currentTarget);
  2. objId = "#"+$(obj).attr('id');


W każdej sytuacji objId zawsze ma wartość "#rodzic". obj jest typu object. [Object] object :/
Go to the top of the page
+Quote Post
kicaj
post
Post #4





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

Ostrzeżenie: (0%)
-----


Kod
$("#rodzic").live('click', function() {
  $(this).append('<div id="losoweid"></div>');
});


--------------------
PHP Developer

"Nadmiar wiedzy jest równie szkodliwy jak jej brak" Émile Zola
Go to the top of the page
+Quote Post
zegarek84
post
Post #5





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


Cytat(gregiolo @ 4.06.2011, 16:27:39 ) *
Hmm pomysł ciekawy, ale niestety nie działa.

prawie to rozwiązanie które podał @everth tylko przede wszystkim nie currentTarget a .target


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
everth
post
Post #6





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


@zegarek84
Dzięki

Doszedłem jednak do wniosku że @kicaj ma rację, lepiej użyć tu live w połączeniu z dodatkową klasą
[JAVASCRIPT] pobierz, plaintext
  1. $('#rodzic, .appendable').live('click', function(e) {
  2. $(this).append('<div id="losoweid" class="appendable"></div>');
  3. });
[JAVASCRIPT] pobierz, plaintext


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
gregiolo
post
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.02.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Dzieki za pomoc. Spróbowałem sprawdzić wszystkie opcje, ale za każdym razem wywoływany jest zarówno rodzic jak i potomek. Nie potrafię tego zniwelować. Użyłem standardowego JavaScript z onclick i wszystkie problemy się rozwiązały.
Go to the top of the page
+Quote Post
zegarek84
post
Post #8





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


@everth - mylisz się z 2 powodów, pierwszy mało znaczący to wydajność - live tutaj będzie wolniejszy od poprzedniego rozwiązania, drugi, to jeśli będziesz miał div w div'ie to do każdego dopasowanego elementu doda (wykona append) - a nie o to chodziło... live działa na zasadzie, że bind jest podpięty do body lub do html'a i potem elementy w górę drzewa DOM od .target są porównywane z elementami dopasowanymi do "selektorów"....
.lieve - Event Delegation

czyli to działa na podobnej zasadzie co przykład z bind'em, pobraniem target'a i przeszukaniem w górę przez closest
http://api.jquery.com/closest/#example-0

Cytat(gregiolo @ 4.06.2011, 18:22:25 ) *
Dzieki za pomoc. Spróbowałem sprawdzić wszystkie opcje, ale za każdym razem wywoływany jest zarówno rodzic jak i potomek. Nie potrafię tego zniwelować. Użyłem standardowego JavaScript z onclick i wszystkie problemy się rozwiązały.

nie wypróbowałeś wszystkich opcji ;]


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
everth
post
Post #9





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


To dziwne bo sprawdziłem u siebie na prostym przykładzie i działa. Tak, masz rację - live działa w sposób jaki opisujesz, tylko metoda closest zwraca najbliższy pasujący selektor w kontekście e.target - w tym wypadku kliknięty element appendable i stosuje do niego funkcję. To nie jest propagowane w górę.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 12:42