2012-04-04 30 views
5

Tôi có một số HTML như thế này:là jquery .find luôn hữu ích?

<div id="MyDiv"> 

    <div class="Class1"> 
    <div class="SClass1"></div> 
    </div> 
    <div class="Class2"></div> 

</div> 

Có sự khác biệt giữa

$('#MyDiv').find('.SClass1').show(); 

$('#MyDiv .SClass1').show(); 
+2

Không, họ là tương đương. –

+0

http://api.jquery.com/jquery/#selector-context có thể giúp bạn với sự hiểu biết của bạn – Greg

+0

ok, các bạn rất tuyệt! – frenchie

Trả lời

2

trong bạn trường hợp, sử dụng find() là khá vô nghĩa (trừ khả năng đọc - nhưng bất cứ ai cũng sẽ có ý kiến ​​khác về điều đó). tôi chỉ sử dụng find() trong trường hợp nó thực sự cần thiết, như:

$('#MyDiv').show().find('.SClass1').css(...); 

nơi một cái gì đó phải được thực hiện với phụ huynh-yếu tố đầu tiên và cái gì khác với một hoặc nhiều con của nó.

2

Về cơ bản, không có sự khác biệt. Nhưng find() rất hữu ích nếu bạn sử dụng nó với các biến có phạm vi và this.

Ví dụ:

$(document).ready(function() { 
    $('.action').click(function() { 
     $(this).find('p').text("hello world"); 
    }); 
}); 

nào tập hợp tất cả p trong bất cứ điều gì trong đó có một lớp có tên action để "hello world".

2

Cả hai đều tương đương nhau. Người đầu tiên sẽ hơi chậm hơn, vì bạn đang thực hiện hai truy vấn. Sự khác biệt về tốc độ có lẽ không đáng chú ý.

Bạn có thể sử dụng find trong những trường hợp khi bạn đang tạo một plugin/thành phần mà được nó chứa trong các nhà xây dựng và hơn bạn sử dụng nó như thư mục gốc của tìm kiếm của bạn với find để đảm bảo rằng bạn không nhận được bất kỳ yếu tố bên ngoài vùng chứa của bạn.

3

http://api.jquery.com/jquery/#selector-context khẳng định rằng:

Bên trong, bối cảnh selector được thực hiện với phương pháp .find(), nên $ ('tuổi', điều này) là tương đương với $ (this) .find ('tuổi ').

Có nghĩa

$('#MyDiv .SClass1').show(); 

là chỉ có một bước xa jQuery trong nội bộ làm cho nó

$('#MyDiv').find('.SClass1').show(); 

View this jsPerf test case to see the differences in speed


Như @Dominic đề cập trong các ý kiến, trong anh.210, Paul Irish khẳng định:

Selector Tối ưu hóa

Tất nhiên, giảm dần từ một #ID là tốt nhất

// #id-based selector 
var arms = $('#container div.robotarm'); 

// hyper-optimized #id case first, then find: 
var arms = $('#container').find('div.robotarm'); 
+0

No. Đọc báo giá lần nữa: nó nói nó sẽ giống như làm '$ ('. SClass1', $ ('# MyDiv)). Show();' - có bộ chọn là một chuỗi một điều khác (nhưng cũng cho kết quả tương tự). – oezi

+0

Có phải trường hợp đầu tiên nhanh hơn/tối ưu hơn không? Tôi có một chút không rõ ràng của gritty nitty, nhưng tôi nghĩ viết selector của bạn với id đầu tiên sau đó sử dụng find() hoặc bỏ qua công cụ chọn jQuery Sizzle, hoặc làm cho nó hiệu quả hơn. Niềm tin của tôi dựa trên video hiệu suất jQuery của Paul Irish: http://paulirish.com/2009/perf/ (slide 30) – Dominic

+0

@oezi - Tương đương trong thực thi, nhưng không phải lúc nào cũng có tốc độ. Xem câu trả lời cập nhật của tôi, nơi tôi đã thêm một liên kết đến một jsPerf cho thấy điều đó. –