Raphael Brick

Raphael Brick Vince in bono
malum...

Temat: problem z obsługą zdarzeń

jQuery('<li></li>').appendTo('#files').html('<img src="./uploads/'+file+'" alt="" /><br />'+'<input type="text" value="'+count+'" /> <input type="button" id="usun" value="usun" />').addClass('success');

następnie chcę obsłużyć id=usun na zdarzenie kliknięcia, ale nie potrafiętego przechwycić

Funkcja przechwytująca działa na każdy inny id który jest z góry zapisany w kodzie natomiast na taki dodawany za pomocą jquery i ajax nie działa

może by mnie kto naprowadził ??
Karol Nowacki

Karol Nowacki Programista PHP,
Perl, C,
administrator
systemów *NIX

Temat: problem z obsługą zdarzeń

Zacznijmy od tego, że nie powinniśmy dodawać id="usun" gdyż po dwóch takich operacjach będziemy mieli w dokumencie dwa elementy o takim samym id, co jest delikatnie mówiąc niewskazane. Lepie zrobić class="usun", wówczas można zrobić tak:

var li = jQuery('<li></li>')....
$('.usun', li).click(function(){ ... });

i powinno być OK
Kamil Kosiński

Kamil Kosiński CTO w
DobryMechanik.pl

Temat: problem z obsługą zdarzeń

użyj live() lub podepnij zdarzenie w momencie tworzenia elementu

konto usunięte

Temat: problem z obsługą zdarzeń

Hmm....
Nie do konca rozumiem co masz na mysli...
Ale pierwsza sprawa - tak jak wspomnial Karol - id powinno byc unikatowe na calej stronie (i nie moze zaczynac sie od cyfry, tak jakbys chcial to jakims loopem zrobic).

jesli bedziesz mial cos w stylu
$('#usun').click(function(){ blabla})
to musisz to zamienic na .live(mousedown, function() {}) w zwiazku z tym ze tresc wstawiles dynamicznie, pozniej, po pierwszym wgraniu calej strony.

zamien to id na class, i
$('.usun').live(mousedown, function() { alert('dziala!');});

powinno zadzialac na kazdy klik i nie wazne czy bylo to pierwsze wgranie i to co ma classe "usun" bylo czescia htmla, czy zostalo pozniej dodane do DOM za pomoca innej funkcji JS.Andrzej Winnicki edytował(a) ten post dnia 04.11.10 o godzinie 22:53
Raphael Brick

Raphael Brick Vince in bono
malum...

Temat: problem z obsługą zdarzeń

dzięki za podpowiedzi, zaczęło działać z live :)

konto usunięte

Temat: problem z obsługą zdarzeń

live jest fajne, bardzo dobrze sie sprawdza.
W ostatnim projekcie ktory mecze i dosc duzo rzeczy dodawane jest dynamicznie do DOMa, zaczalem juz wiekszosc efektow stosowac w taki sposob. Daje to wieksze pole manerwu i mozna calkowicie swobodnie i w dowolnej chwili modfyikowac DOM, nie martwiac sie ze cos nagle nie zadziala i nie bedzie miec eventow ktorych sie spodziewamy ;)

Poczytaj troszke o live i roznych sposobach dodawanie eventow, bo jednym ruchem mozna zrobic zalatwic rozne eveny - mouseenter, mousedown.
Dla przykladu - zrobilem na takie zasadzie dynamiczne przyciski (wzorem flashowych efektow). mouseover - przycisk sie podswietla, mousedown - przycisk sie "wciska", mouseup - przycisk sie "odklikuje" do stany mouseouver no i na mouseout - powrot do pierwotnego stanu ;)

Ojjj, mozna sie pobawic i powymyslac :P

konto usunięte

Temat: problem z obsługą zdarzeń

Andrzej Winnicki:
live jest fajne, bardzo dobrze sie sprawdza.

Ja dodam od siebie, ze live jest duzo wolniejszy niz podpinanie eventow recznie, szczegolnie widoczne w IE7/8. W duzym projekcie mocno uzywajacym jQuery i jQueryUI musielismy przepisac z live'ow na podpinanie reczne, na IE wykonanie JS spadlo z ponad 6 sekund do 200ms. Kod brzydszy, ale nierozsadnym jest stawiac usera przed kilkoma sekundami postoju. Wiadomo, ze bez Firebuga zyc sie nie da, ale warto takie niuanse miec na uwadze i testowac wydajnosc w najwolniejszej dostepnej przegladarce czyli IE :)

konto usunięte

Temat: problem z obsługą zdarzeń

Sebastian Pienio:

Dzieki za dobra podpowiedz ;) Przyznam szczerze ze nie testowalem osobiscie wplywu live na predkosc i porownania do bind, ale spodziewalem sie ze bedzie to mialo jakis wplyw na predkosc.
Mam kilka rzeczy, ktore bez live nie przejda (no dobra, przejda ale podpinanie zachowan recznie bedzie dla mnie tragedia), ale w takim razie zmienie nieco plan by live bylo podpietem tam, gdzie jest to potrzebne - nic "na zapas".

Ile roznych livow mieliscie, ze wplynelo to tak drastycznie na wydajnosc?
Marek Sybilak

Marek Sybilak raportzaukcji.pl

Temat: problem z obsługą zdarzeń

Zamiast live należy zastosować delegate.
Live niepotrzebnie "idzie" do samej góry, a delegate ograniczone jest do zakresu który podajemy jako argument.
Najpierw było live, ale ze względu na różne problemy stworzono delegate. Live lepiej po prostu nie używać.

konto usunięte

Temat: problem z obsługą zdarzeń

przyznam szczerze ze delagate mi umknelo ;)
czlowiek uczy sie cale zycie.

konto usunięte

Temat: problem z obsługą zdarzeń

Andrzej Winnicki:
przyznam szczerze ze delagate mi umknelo ;)
czlowiek uczy sie cale zycie.
A i tak głupi umiera :)

konto usunięte

Temat: problem z obsługą zdarzeń

Andrzej Winnicki:
Ile roznych livow mieliscie, ze wplynelo to tak drastycznie na wydajnosc?

Mielismy ok. 6 roznych live'ow, problem zaczynal sie przy ok. 70-80 elementach na stronie. W naszym systemie mamy drag and drop i w momencie upuszczenia klonujemy element. Nastepnym razem gdy uzytkownik bedzie chcial zrobic drag and drop na tym elemencie, najpierw aktywowane bylo zdarzenie ustawiajace parametry (tez live). Natrafilismy na dwa problemy:
1) IE nie radzil sobie z clone(true)
2) IE wykonywal prostego JSa ponad 6 sekund (FF < 200ms, Chrome od reki)
Zaczelismy od optymalizacji selektorow, IE mial ogromne problemy z .class1 > .class2, wiec na elementach zawierajacych class1 dopisalismy class2 i szukalismy zawsze .class1.class2 > *, wydajnosc wzrosla (ok. 3-4 sekundy na IE), ale ciagle nie bylo to. Wyrzucilismy wszystkie live i delegate, zastapilismy klasami, ktore recznie robia bind i unbind, w tym momencie przy ok. 100 elementach na stronie IE8/7 wyrabiaja sie w ok. 200ms (FF i Chrome nigdy nie mialy problemow). Ciagle zauwazalne, ale "uzywalne" :) W miedzyczasie dopisalismy wszedzie gdzie sie dalo tagi, czyli .classA zamienilismy na div.classA (znowu trick dla IE) i cache wszystkiego co sie da + wyrzucilismy wszystkie .each i zastapilismy prostymi petlami (w IE czasami gubi, a dokladniej zmienia kontekst, szczegolnie v1.4, doczytalem pozniej, ze IE ma generalnie pseudo js-multiwatkowosc i stad te problemy). Wszystkie operacje na DOM przerzucilismy na klasy, nie robimy wiec .hide, lecz .addClass('hideMe'), ten trik znaczaco polepsza wydajnosc IE przy duzej ilosci ukrytych elementow. Ogolny wzrost "responsiveness" w IE ogromny, ale przy FF czy Chrome ciagle wyglada blado, moze IE9...

Następna dyskusja:

Problem z obsługą kliku




Wyślij zaproszenie do