Byłem osobą, która zapoczątkowała tę konwencję w 2006 roku i wypromowałam ją na wczesnej liście mailingowej jQuery, więc pozwólcie, że podzielę się historią i motywacją wokół niej.
Zaakceptowana odpowiedź podaje następujący przykład:
var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself
Ale to tak naprawdę nie ilustruje tego dobrze. Nawet bez $
, nadal mielibyśmy tutaj dwie różne nazwy zmiennych email
i email_field
. Tam jest mnóstwo dobrych rzeczy. Dlaczego musielibyśmy wrzucić $
jedno z imion, skoro mamy już dwa różne imiona?
Właściwie nie użyłbym email_field
tutaj z dwóch powodów: names_with_underscores
nie są idiomatycznym JavaScriptem i field
nie mają sensu dla elementu DOM. Ale podążyłem za tym samym pomysłem.
Próbowałem kilku różnych rzeczy, w tym czegoś bardzo podobnego do przykładu:
var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it
(Oczywiście obiekt jQuery może mieć więcej niż jeden element DOM, ale kod, nad którym pracowałem, miał wiele id
selektorów, więc w tych przypadkach istniała korespondencja 1: 1).
Miałem inny przypadek, w którym funkcja otrzymała element DOM jako parametr i również potrzebowała do tego obiektu jQuery:
// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
var emailJQ = $(email);
// Now email is the DOM element and emailJQ is a jQuery object for it
}
To trochę mylące! W jednym z moich fragmentów kodu email
znajduje się obiekt jQuery i emailElement
element DOM, ale w drugim email
jest element DOM i emailJQ
obiekt jQuery.
Nie było spójności i ciągle je mieszałem. Dodatkowo było trochę uciążliwości wymyślić dwie różne nazwy dla tej samej rzeczy: jedną dla obiektu jQuery i drugą dla pasującego elementu DOM. Poza tym email
, emailElement
iemailJQ
, Próbowałem też inne odmiany.
Potem zauważyłem wspólny wzór:
var email = $("#email");
var emailJQ = $(email);
Ponieważ JavaScript traktuje $
jak zwykłą literę nazw, a ponieważ zawsze otrzymywałem obiekt jQuery po $(whatever)
wywołaniu, wzorzec ostatecznie do mnie dotarł . Mógłbym odebrać $(...)
telefon i po prostu usunąć niektóre postacie, a to wymyśliłoby całkiem ładne imię:
$("#email")
$(email)
Strikeout nie jest idealny, ale możesz wpaść na pomysł: po usunięciu niektórych znaków obie te linie wyglądają następująco:
$email
Wtedy zdałem sobie sprawę, że nie muszę wymyślać konwencji takiej jak emailElement
lub emailJQ
. Wpatrywała się we mnie już ładna konwencja: wyjmij niektóre postacie z $(whatever)
rozmowy, a to się zmieni $whatever
.
var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object
i:
// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
var $email = $(email);
// $email is the jQuery object and email is the DOM object
// Same names as in the code above. Yay!
}
Nie musiałem więc wymyślać dwóch różnych nazw przez cały czas, ale mogłem używać tej samej nazwy z $
prefiksem lub bez . A $
prefiks był miłym przypomnieniem, że miałem do czynienia z obiektem jQuery:
$('#email').click( ... );
lub:
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );