Tôi là người đã khởi nguồn hội nghị này vào năm 2006 và đã quảng bá nó trong danh sách gửi thư jQuery ban đầu, vì vậy hãy để tôi chia sẻ một số lịch sử và động lực xung quanh nó.
Câu trả lời được chấp nhận đưa ra ví dụ này:
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
Nhưng điều đó không thực sự minh họa nó tốt. Ngay cả khi không có $
, chúng ta vẫn sẽ có hai tên biến khác nhau ở đây email
và email_field
. Đó là rất nhiều tốt ở đó. Tại sao chúng ta cần phải ném một $
trong những tên khi chúng ta đã có hai tên khác nhau?
Trên thực tế, tôi đã không sử dụng email_field
ở đây vì hai lý do: names_with_underscores
không phải là JavaScript thành ngữ và field
không thực sự có ý nghĩa đối với một phần tử DOM. Nhưng tôi đã làm theo cùng một ý tưởng.
Tôi đã thử một vài thứ khác nhau, trong số đó có một cái gì đó rất giống với ví dụ:
var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it
(Tất nhiên một đối tượng jQuery có thể có nhiều hơn một phần tử DOM, nhưng mã tôi đang làm việc có rất nhiều id
bộ chọn, vì vậy trong những trường hợp đó có sự tương ứng 1: 1.)
Tôi đã có một trường hợp khác khi một hàm nhận một phần tử DOM làm tham số và cũng cần một đối tượng jQuery cho nó:
// 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
}
Vâng, đó là một chút bối rối! Trong một trong các đoạn mã của tôi, email
là đối tượng jQuery và emailElement
là phần tử DOM, nhưng trong phần còn lại, email
là phần tử DOM và emailJQ
là đối tượng jQuery.
Không có sự thống nhất và tôi tiếp tục trộn chúng lên. Thêm vào đó, có một chút phiền toái khi phải tạo ra hai tên khác nhau cho cùng một thứ: một cho đối tượng jQuery và một tên khác cho thành phần DOM phù hợp. Bên cạnh đó email
, emailElement
và emailJQ
, tôi cũng tiếp tục thử các biến thể khác.
Sau đó, tôi nhận thấy một mô hình phổ biến:
var email = $("#email");
var emailJQ = $(email);
Vì JavaScript coi $
đơn giản là một chữ cái khác cho các tên và vì tôi luôn nhận được một đối tượng jQuery từ một $(whatever)
cuộc gọi, nên mẫu cuối cùng cũng nhận ra tôi. Tôi có thể nhận một $(...)
cuộc gọi và chỉ cần loại bỏ một số ký tự, và nó sẽ xuất hiện với một cái tên khá hay:
$("#email")
$(email)
Strikeout không hoàn hảo, nhưng bạn có thể hiểu ý tưởng: với một số ký tự bị xóa, cả hai dòng này cuối cùng trông giống như:
$email
Đó là khi tôi nhận ra mình không cần phải tạo nên một quy ước như emailElement
hay emailJQ
. Đã có một quy ước tốt đẹp nhìn chằm chằm vào tôi: đưa một số nhân vật ra khỏi $(whatever)
cuộc gọi và nó biến thành $whatever
.
var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object
và:
// 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!
}
Vì vậy, tôi đã không phải tạo ra hai tên khác nhau mọi lúc mà chỉ có thể sử dụng cùng một tên có hoặc không có $
tiền tố. Và $
tiền tố là một lời nhắc tốt đẹp rằng tôi đang xử lý một đối tượng jQuery:
$('#email').click( ... );
hoặc là:
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );