2012-03-12 37 views
25

tôi thấy mọi người tạo ra các phần tử HTML trong jQuery theo hai cách khác nhau:

$('<element>') 

$('<element />') 

Tôi tò mò mà một là "chính xác hơn". Tôi thấy lợi thế rõ ràng đối với cái đầu tiên chỉ đơn giản là ít hơn để gõ. Liệu nó có tạo sự khác biệt ở tất cả những gì được sử dụng?

+3

và tại sao bạn không thể sử dụng 'document.createElement ('tố')'? Có luật nào buộc bạn viết mã chậm nhất có thể không? –

+4

@ tereško Trừ khi bạn điểm chuẩn rằng đoạn mã này là một nút cổ chai trong ứng dụng của bạn, hiệu suất không phải là yếu tố chính trong lựa chọn này. Tôi mong đợi sự khác biệt về hiệu năng chỉ có liên quan trong các vòng lặp chặt chẽ. Nhưng khá rõ ràng và nhất quán của mã. Nếu bạn sử dụng jquery ở hầu hết các nơi, không có lý do gì để sử dụng DOM ở đây, và nếu bạn chủ yếu sử dụng DOM, không có lý do gì để sử dụng jquery cho việc này. – CodesInChaos

+1

@ tereško +1 ... chi phí tạo đối tượng + chi phí phân tích chuỗi + chi phí của nhiều điều kiện + chi phí của mẫu thiết kế điên = hóa đơn jQuery. – Shea

Trả lời

25

Không có sự khác biệt, như đã thấy trong mã nguồn, line 30 & line 121:

/* Line 30*/ 
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, 

/* Line 121 */ 
// If a single string is passed in and it's a single tag 
// just do a createElement and skip the rest 
ret = rsingleTag.exec(selector); 

Sau đây là tương đương :

  • <a></a>
  • <a />
  • <a>
+3

Khi tôi đang viết câu hỏi này, tôi đã nghĩ rằng tôi có thể tự mình tìm ra bằng cách nhìn vào mã nguồn. Tôi đánh giá cao bạn tham khảo mã trực tiếp trong câu trả lời của bạn. – GoldenNewby

+0

Vì vậy, không có sự khác biệt ** miễn là bạn không bao giờ có thuộc tính ** trong câu lệnh tạo. Nếu bạn thay đổi mã thành '$ ('')' thì trình duyệt của bất kỳ ai .innerHTML sẽ phân tích cú pháp đó. –

4

Không, nó hoàn toàn không khác biệt, miễn là định nghĩa phần tử được định dạng đúng. Phong cách thứ hai chỉ đơn giản là an alternate syntax mà có thể thực sự lưu tổ hợp phím:

$('<a href="herp.derp.com/sherp"/>'); // XML-like syntax 
$('<a href="herp.derp.com/sherp"></a>'); // Well-formed HTML 
$('<a href="herp.derp.com/sherp">');  // Malformed (no closing tag) 
+0

Thats một điểm thú vị về làm thế nào trong ứng dụng mà nó tiết kiệm tổ hợp phím. Tôi đã luôn luôn chỉ được sử dụng .attr để thiết lập href. – GoldenNewby

+0

Đó là một ví dụ ngớ ngẩn, đúng, nhưng có những trường hợp thực sự khi sử dụng cú pháp XML bằng cách nhập ít hơn. –

0

Một yếu tố tốc ký <element /> đòi hỏi một dấu gạch chéo vì thay thế nó <element> </element>. Vì vậy, bạn sẽ viết rằng bất cứ nơi nào thích hợp vì lợi ích của đánh dấu hợp lệ. Nhưng nó không phải là cách này hay cách khác.

Đã chỉnh sửa: đây không thực sự là vấn đề. những người khác ở đây dường như đồng ý rằng vấn đề về hiệu suất regex

+1

Nó không thực sự có bất cứ điều gì để làm với đánh dấu hợp lệ. Đó là nhiều mẫu mà regex của jQuery tìm kiếm khi xác định xem một phần tử rỗng có được dự định hay không, điều này sẽ khiến jQuery sử dụng 'document.createElement()'. Nếu thêm bất cứ điều gì, thì '.innerHTML' sẽ được sử dụng và giá trị sẽ quan trọng hơn. –

+0

@amnotiam oh tôi hiểu rồi.Tôi đứng sửa. – Kristian

6

về mặt kỹ thuật $('<element></element>') là chính xác hơn, vì thẻ đóng tự động sử dụng / đã bị xóa trong HTML5, vì câu lệnh đó được phân tích bởi jQuery. Nếu bất cứ điều gì, chỉ cần sử dụng $('<element>')có thể thực sự nhanh hơn một chút, vì ít ký tự hơn để đọc. Mà nên bỏ qua một số điều kiện Regex là tốt.

Hơn thế nữa, nếu bạn đang tìm kiếm nhanh nhất thể cách sử dụng jQuery:

var temp = new jQuery.fn.init(); 
temp[0] = document.createElement('element'); 
temp.length = 1; 

Phiên bản này là nhanh nhất, bởi vì nó bỏ qua jQuery() mà kết thúc tốt đẹp "jQuery.fn.init mới()" và không chuyển đối số để nó ngay lập tức trả về một đối tượng jQuery mới. Nó bỏ qua rất nhiều điều kiện và báo cáo không an toàn, đó là không cần thiết nếu bạn đã biết chính xác những gì bạn đang cố gắng làm.

Hoặc hơi ngắn hơn:

var temp = $(document.createElement('element')); 

Phiên bản này là hơi chậm, nhưng dễ dàng hơn để đọc, và một gọn gàng rất nhiều. Nó vẫn bỏ qua một đoạn mã lớn được sử dụng để phân tích cú pháp, chuỗi sẽ được truyền đi. Thay vào đó, jQuery có thể tự động biết chúng ta đang làm việc với một nút ở đây.

Reference
HTML5 Does NOT Allow “Self-Closing” Tags
Google: html5 self closing tags
jsperf

+0

Không có phiên bản HTML nào trước khi HTML5 có thẻ tự đóng. [Chúng hợp lệ trong HTML5] (http://dev.w3.org/html5/spec-author-view/syntax.html#syntax-start-tag) nhưng nó không có sự khác biệt về các phần tử void. –

4

Đây là những gì jQuery docs nói về nó:

Để đảm bảo khả năng tương thích đa nền tảng, đoạn phải được well-formed. Thẻ có thể chứa các yếu tố khác cần được kết hợp với một thẻ đóng:

$('<a href="http://jquery.com"></a>');

Ngoài ra, jQuery cho phép cú pháp thẻ XML-tương tự (có hoặc không có dấu cách trước dấu gạch chéo):

$('<a/>');

Thẻ mà không thể chứa các thành phần có thể được nhanh chóng đóng cửa hoặc không:

$('<img />'); $('<input>');

Xem câu hỏi này, tuy nhiên, về những gì là hiệu quả nhất:

What is the most efficient way to create HTML elements using jQuery?

2

Tôi chạy cả các sản phẩm được jsperf và tìm thấy sự khác biệt tối thiểu giữa hai cho hiệu suất, vì vậy tôi giả sử nó sẽ kết thúc là một vấn đề ưu tiên, và yếu tố nào bạn đang tạo ra. Tôi khuyên bạn nên chạy thử nghiệm thêm trên jsperf.

jsperf faq: http://jsperf.com/faq

Kết quả cuối cùng: jsperf test

Các vấn đề liên quan