2012-01-09 57 views
10

Tôi đang làm việc với một bảng điều khiển của divs và mỗi div nó có một cây trong đó các nút được. Mỗi lần tôi phải biết id nào của div đó là vì vậy tôi đang sử dụng parent() rất nhiều.Cha mẹ(), thay thế nhanh hơn?

Chủ yếu là tôi đang làm $(this).parent().parent().parent() để tìm ID của div để tôi có thể đặt biến cho nó. Ứng dụng được dựa trên id của mỗi div.

Có nên xem xét chậm sử dụng cha mẹ() tối đa 3 lần nhưng khá nhiều trên mọi chức năng?

Có phương án nào khác không?

Tôi đang tìm một thứ gì đó giống như kiểu điểm chuẩn cho thấy những gì nhanh hơn.

Dưới đây là một ví dụ về cây:

<div id="6179827893" class="dashdiv"> 
    <div class="buttons"> 
    <li><a href="#" class="btn1">Button 1</a></li> 
    <li><a href="#" class="btn2">Button 2</a></li> 
    <li><a href="#" class="btn3">Button 3</a></li> 
    <li><a href="#" class="btn4">Button 4</a></li> 
    <li><a href="#" class="btn5">Button 5</a></li> 
    <li><a href="#" class="btn6">Button 6</a></li> 
    </div> 
    <div class="dashcontent"> 

    .... 

    </div> 
</div> 
+0

có thể là: chứa công cụ chọn là giải pháp. http://api.jquery.com/contains-selector/ – ggzone

+0

Bạn có biết tên lớp CSS của cha mẹ có thể không? –

Trả lời

17

Bạn có một vài tùy chọn để đạt được hiệu quả tương tự.

Điểm chuẩn: http://jsperf.com/parents-method. Theo tiêu chuẩn này, phương pháp của tôi nhanh hơn khoảng 100 lần so với phương pháp của bạn.

Method (see below) : Operations per second (higher is better) 
parentNode3x  : 4447k 
$(parentNode3x) : 204K 
$().closest  : 35k 
$().parents  : 9k 
$().parent()3x  : 44k 

// Likely the fastest way, because no overhead of jQuery is involved. 
var id = this.parentNode.parentNode.parentNode.id; 

// Alternative methods to select the 3rd parent: 
$(this.parentNode.parentNode.parentNode) // Native DOM, wrapped in jQuery 

// Slowpokes 
$(this).closest('.dashdiv')    // Hmm. 
$(this).parents('.dashdiv:first')  // Hmm... 
+0

Là lựa chọn thứ hai của bạn nhanh hơn những gì tôi có? Tôi giả sử parentNode có nghĩa là cha mẹ() – jQuerybeast

+0

@jQuerybeast Tôi đã bao gồm một điểm chuẩn: http://jsperf.com/parents-method –

+0

Cảm ơn bạn và cho điểm chuẩn. Khá nhiều những gì tôi đang tìm kiếm – jQuerybeast

8

Bạn có thể được tốt hơn bằng cách sử dụng .closest(), như thế này: $(this).closest('.dashdiv')

Nó không phải bất kỳ nhanh hơn từ quan điểm của một động cơ của xem, kể từ khi bạn đang vẫn lặp lại thông qua các lớp DOM, nhưng rõ ràng hơn đối với người mới đến cũng như mã ngắn hơn.

BÌNH LUẬN

Nếu đó là tốc độ tinh khiết bạn sau đó, bạn cũng có thể bỏ qua jQuery hoàn toàn và sử dụng node.parentNode để thay thế. Nhưng điều này đang đi vào vấn đề niggly của chu kỳ đếm, và tôi nghĩ rằng đó là một học tập.

Nếu bạn đang viết mã hiệu suất cao cho sản xuất chính, như công cụ tìm kiếm thương mại hoặc nhà cung cấp email trực tuyến, thì việc đếm chu kỳ rất quan trọng vì mọi tối ưu hóa nhỏ được nhân lên hàng nghìn lần. Với tất cả sự tôn trọng, tôi nghi ngờ bạn đang viết loại mã đó.

Nếu bạn đang viết nội dung nào đó sẽ bị một vài người đánh vào một lúc, tối đa thì tối ưu hóa nhỏ là một bài tập trí tuệ sẽ không ảnh hưởng đến kết quả theo bất kỳ cách nào đáng chú ý. Bạn sẽ phải cải thiện hiệu suất của mã của bạn bằng hàng trăm mili giây trước khi bất kỳ người dùng nào thậm chí sẽ bắt đầu chú ý và mã này sẽ không làm điều đó.

Thay vào đó, điều quan trọng hơn rất nhiều khi nghĩ về nhà phát triển tiếp theo, những người sẽ xem mã của bạn. Đối với nhà phát triển đó, điều quan trọng là phải có mã rõ ràng, được viết tốt ngay lập tức truyền đạt những gì nó đang làm. Chuỗi các phương pháp làm mờ mắt như parent().parent().parent() có thể làm mờ và gây nhầm lẫn cho các nhà phát triển khác, không nói gì về số node.parentNode.parentNode.parentNode

- đó là lý do tại sao .closest() được tạo ngay từ đầu. Nó rõ ràng, súc tích, và không đáng chú ý là kém hiệu quả hơn so với các chuỗi nó thay thế. 999 lần trong số một ngàn, đó là cách bạn nên đi.

+0

gần nhất không được xem là nhanh hơn. jQuery phải tìm kiếm gần hơn nơi cha mẹ không – jQuerybeast

+0

Vâng, đó là suy nghĩ của tôi. Nhưng tôi nghĩ có một sự hy sinh nhỏ được thực hiện ở đây để đổi lấy mã rõ ràng hơn, ngắn gọn hơn. Nếu đó là tốc độ thuần túy, bạn cũng có thể bỏ qua jQuery hoàn toàn và sử dụng ['node.parentNode'] (https://developer.mozilla.org/En/DOM/Node.parentNode) để thay thế. – Blazemonger

+0

Cảm ơn bạn. Vâng trả lời. Câu trả lời của Rob được chọn là những gì tôi sẽ sử dụng và cho điểm chuẩn – jQuerybeast

2

Trước tiên, không tối ưu hóa sớm. Nếu nó không gây ra một vấn đề (và kiểm tra kỹ lưỡng bằng mọi cách, trên một loạt các nền tảng) thì đừng lo lắng về nó.

Có một tối ưu hóa khả năng: sử dụng thuộc tính DOM bản địa:

var id = this.parentNode.parentNode.parentNode.id; 

Lưu ý rằng jQuery cách đẹp nhất để làm điều này (mà sẽ chậm hơn, nhưng điều đó có thể không phải là một vấn đề) là với closest:

$(this).closest('div.dashdiv').prop('id'); 
+0

Tôi nhận thức được gần nhất nhưng nó có lẽ là chậm nhất của tất cả và như các ứng dụng được lớn hơn và lớn hơn mà sẽ là một nỗi đau. Tôi giả sử như Rob W đã nói, parentNode sẽ là quyền nhanh hơn? – jQuerybeast

+1

@jQuerybeast Có: [đó là những gì jQuery sử dụng nội bộ] (https://github.com/jquery/jquery/blob/master/src/traversing.js#L179). – lonesomeday

+0

Ha! Đẹp nhất trên liên kết. Xem xét của bạn 'không tối ưu hóa sớm' Im không chắc chắn liệu tôi nên trao đổi cha mẹ() với parentNode hoặc để nó như là – jQuerybeast

1

Nếu trình xử lý hiện đang ở trên các yếu tố <a>, hãy đặt chúng trên các phần tử .dashdiv thay thế.

Sau đó, bạn có thể làm this.id nếu e.target là yếu tố <a>.

$('.dashdiv').click(function(e) { 
    if(e.target.nodeName.toLowerCase() === 'a') { 
     alert(this.id); 
    } 
}); 
Các vấn đề liên quan