Mam ogromną aplikację jQuery, i ja'm używając poniższych dwóch metod dla zdarzeń kliknięcia.
Pierwsza metoda
<div id="myDiv">Some Content</div>
$('#myDiv').click(function(){
//Some code
});
Druga metoda
<div id="myDiv" onClick="divFunction()">Some Content</div>
function divFunction(){
//Some code
}
W mojej aplikacji używam albo pierwszej, albo drugiej metody. Która z nich jest lepsza? Lepsza dla wydajności? I standard?
Użycie $('#myDiv').click(function(){
jest lepsze, ponieważ podąża za standardowym modelem rejestracji zdarzeń. (jQuery wewnętrznie używa addEventListener
i attachEvent
).
Zasadniczo rejestrowanie zdarzenia w nowoczesny sposób jest dyskretnym sposobem obsługi zdarzeń. Również aby zarejestrować więcej niż jednego słuchacza zdarzeń dla celu możesz wywołać addEventListener()
dla tego samego celu.
var myEl = document.getElementById('myelement');
myEl.addEventListener('click', function() {
alert('Hello world');
}, false);
myEl.addEventListener('click', function() {
alert('Hello world again!!!');
}, false);
Dlaczego warto używać addEventListener? (Z MDN)
addEventListener jest sposobem na zarejestrowanie słuchacza zdarzeń, jak określono w W3C DOM. Jego zalety są następujące:
- Pozwala na dodanie więcej niż jednego handler'a dla zdarzenia. Jest to szczególnie przydatne dla bibliotek DHTML lub rozszerzeń Mozilli, które muszą działać dobrze, nawet jeśli używane są inne biblioteki/rozszerzenia.
- Daje dokładniejszą kontrolę nad fazą, w której aktywowany jest listener (przechwytywanie vs. bubbling)
- Działa na każdym elemencie DOM, nie tylko na elementach HTML.
Więcej o Nowoczesna rejestracja zdarzeń -> http://www.quirksmode.org/js/events_advanced.html
Inne metody, takie jak ustawianie atrybutów HTML, przykład:
<button onclick="alert('Hello world!')">
Lub właściwości elementu DOM, przykład:
myEl.onclick = function(event){alert('Hello world');};
są stare i można je łatwo nadpisać.
Atrybut HTML powinien być unikany, ponieważ sprawia, że znacznik jest większy i mniej czytelny. Problemy związane z treścią/strukturą i zachowaniem nie są dobrze oddzielone, co sprawia, że błąd jest trudniejszy do znalezienia.
Problem z metodą DOM element properties polega na tym, że tylko jeden event handler może być związany z elementem na zdarzenie.
Więcej o tradycyjnej obsłudze zdarzeń -> http://www.quirksmode.org/js/events_tradmod.html
Odnośnik MDN: https://developer.mozilla.org/en-US/docs/DOM/event
Pierwsza metoda jest preferowana. Wykorzystuje ona zaawansowany model rejestracji zdarzeń, co oznacza, że możesz dołączyć wiele handlerów do tego samego elementu. Możesz łatwo uzyskać dostęp do obiektu zdarzenia, a handler może żyć w dowolnym zakresie funkcji'. Ponadto jest on dynamiczny, tzn. może być wywołany w dowolnym momencie i jest szczególnie dobrze dostosowany do dynamicznie generowanych elementów. Nie ma znaczenia, czy korzystasz z jQuery, innej biblioteki czy bezpośrednio z metod natywnych.
Druga metoda, wykorzystująca atrybuty inline, wymaga wielu funkcji globalnych (co prowadzi do zanieczyszczenia przestrzeni nazw) i miesza treść/strukturę (HTML) z zachowaniem (JavaScript). Nie używaj tego.
Na twoje pytanie o wydajność lub standardy nie można'łatwo odpowiedzieć. Te dwie metody są po prostu zupełnie różne i robią różne rzeczy. Pierwsza z nich jest potężniejsza, podczas gdy druga jest pogardzana (uważana za zły styl).