Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: kilkukrotna obsługa kodu zdarzenia

przed chwilą się trochę zdziwiłem

kod

$(document).ready(function() {
//jakaś akcja
});



użyłem 2 razy i dwa razy się wykonał ;)
Dla mnie wychowanego na objectpascalu to coś nienaturalnego.
Czy to cecha jQuery czy ogólnie JS i czy to jest bezpieczne ?
Marcin Domański

Marcin Domański webdeveloper, grafik

Temat: kilkukrotna obsługa kodu zdarzenia

Ale to jest normalne i bardzo dobrze, że tak się dzieje.
Nie wiem jak to było w pascalu, ale w JS jest jak w większości języków.

Masz więc obiekty takie jak buttony itp rzeczy (u ciebie document), do których podpinasz jakieś funkcje, które reagują na zdarzenia (eventy). Dla jednego obiektu możesz takich zdarzeń podpiąć ile chcesz (nawet tych samych). Potem niektóre możesz usuwać, dodawać nowe itp równocześnie nie martwiąc się tym co było wcześniej.

$('input').on('click.jeden', function() {console.log(1)});
$('input').on('click.dwa', function() {console.log(2)});
Kliknięcie pokaże ci oba komunikaty.

Potem możesz np.:

$('input').off('click.jeden');
$('input').on('click.trzy', function() {console.log(3)});

Pokaże ci 2 i 3

konto usunięte

Temat: kilkukrotna obsługa kodu zdarzenia

No nie do końca ile chcesz. Przeglądarki mają swoje limity. Ale są duże.

Na surowo kod wygląda tak:

document.getElementById('myButton').addEventListener('click', function (event) {
doSomething();
});


Dlatego często mówiłem że lepiej by było gdyby funkcja jquery nazywała się addClick() co właściwie robi. Przez brak zrozumienia JavaScript "programiści jQuery" potrafią tak namieszać że się w pale nie mieści.

Masz pewną kontrolę kiedy dodajesz listener. Funkcja którą przekazujesz może zwrócić wartość true/false. Możesz użyć .stopPropagation() na obiekcie event (przekazywany do funkcji w pierwszym parametrze) czy użyć trzeciego parametru useCapture. Zbadaj sobie wszystkie te opcje.

konto usunięte

Temat: kilkukrotna obsługa kodu zdarzenia

Wojciech M.:
Tak, bezpieczne. Pamietaj ze tak naprawde mozesz miec kilka skryptow JS na stronie i wszystkie moga czekac az DOM bedzie gotowy. Pod kazdy event (click, hover, focus, etc) mozesz dodawac wiele funkcji, zachowan czy cokolwiek tam chcesz zrobic. Dosc wygodne rozwiazanie... aczkolwiek jak zaczniesz przesadzac (i zaczniesz bubblowac eventy) to odbije sie to drastycznie na wydajnosci.
Wojciech Mazurek

Wojciech Mazurek właściciel, PPHU
Neuron

Temat: kilkukrotna obsługa kodu zdarzenia

Dariusz P.:
Na surowo kod wygląda tak:

document.getElementById('myButton').addEventListener('click', function (event) {
doSomething();
});


Tyle że tu sam jawnie dodaje akcje do listy natomiast akcja .ready() dodaje się sama - zapewne robi to jquery - za cienki jeszcze jestem aby to przeanalizować.

W JS dużo rzeczy mi się podoba ale kilka mnie przeraża. Co prawda traktuje to wszytsko pomocniczo i w najbliższym czasie nie przewiduję pisania czegoś dużego - uczę się powolutku JS aby część funkcjonalności moich wynalazków przenieść do przeglądarki ale nie wyobrażam sobie w tej chwili napisania czegoś większego z racji tego że specyfika języka wymusza wręcz robienie upierdliwych i ciężkich do wykrycia błędów.

W delphi też mogę dodać akcje (event) onFormActive ale tylko raz i tylko w obrębie obiektu konkretnego okna - jeśli dodałbym powtórną definicje kompilator mi tego nie przyjmie, jeśli chcę wynieść event poza obiekt to muszę to ręcznie oprogramować a tu hulaj dusza piekła nie ma ....
Marcin Domański

Marcin Domański webdeveloper, grafik

Temat: kilkukrotna obsługa kodu zdarzenia

W starych wersjach JS też tak było jak mówisz. Jak chciałeś podpiąć kilka funkcji do konkretnego eventu, musiałeś posłużyć się dodatkową funkcją, która te funkcje grupowała. Dało się z tym żyć, gorzej było gdy chcieliśmy coś konretnego wyłączyć czy usunąć (ale i na to były sposoby).

Nowe deklarowanie eventów daje sporo usprawnień i po prostu pracuje się z nimi wygodniej. Pomijając starsze IE które głupieją w ich obsłudze.
Dlatego właśnie podałem ci kod jQuery, bo korzystając z niej omijasz sporo pierdół z kompatybilnością i używa się jej zwyczajnie wygodniej (chociaż prawdziwi wyjadacze JS zaraz mnie zbluzgają, że tylko tylko czyste JS się liczy).

No niestety JS jest taki sam jak CSS. Z dnia na dzień wszystkich poprawek wprowadzić nie mogą. I tak sporo się zmieniło od czasów wojny "document.layers kontra document.all", ale pewne naleciałości są po dzień dzisiejszy. Kwestia przyzwyczajenia.

Możesz popróbować pobawić się AS3. Jest dość podobny do JS, a bardzo fajnie uczy się tam pisać ładny kod (szczególnie korzystając z programu flash developer)

Temat: kilkukrotna obsługa kodu zdarzenia

Wojciech M.:
W delphi też mogę dodać akcje (event) onFormActive ale tylko raz i tylko w obrębie obiektu konkretnego okna - jeśli dodałbym powtórną definicje kompilator mi tego nie przyjmie, jeśli chcę wynieść event poza obiekt to muszę to ręcznie oprogramować a

http://stackoverflow.com/a/1397042


Button.OnClick := MyClickHandler;
jest równoważne
MultiCastButton.On_Click.Add(MyClickHandler);



Wyślij zaproszenie do