2011-08-22 31 views
6

Tôi có một câu hỏi liên quan đến hiệu quả lọc jQuery. Tôi vừa mới được viết khá một biểu thức dài và tôi đã tự hỏi nếu jQuery dừng lọc nếu số lượng hiện tại của trận đấu là 0.jQuery có tiếp tục lọc nếu nó tìm thấy 0 kết quả phù hợp không?

passengers.filter('input.FromDate[value="01/09/2011"]') 
      .closest('tr') 
      .filter('input.ToDate[value="08/09/2011"]') 
      .length; 

Nếu sau khi filter() cuộc gọi đầu tiên số lượng các trận đấu là 0 sẽ jQuery tiếp tục tìm kiếm DOM hoặc nó sẽ bỏ qua các cuộc gọi bổ sung và chỉ trả về 0?

Trả lời

1

Điều tốt đẹp về các cuộc gọi có thể thực hiện được với jQuery là khi không có kết quả phù hợp, sẽ không có gì xấu xảy ra.

Khi bạn gọi .filter và zero trận đấu đã mang lại, bạn thực hiện các cuộc gọi phương pháp sau đó xích theo định nghĩa bởi vì họ được gọi trực tiếp vào đối tượng trả lại (đó là những gì chaining là).

Khi không có kết quả phù hợp, JavaScript sẽ vẫn gọi từng phương pháp xích sau đó trên từng đối tượng được trả về. Việc xử lý lãng phí xảy ra phụ thuộc vào phương pháp cụ thể đã được thực hiện như thế nào.

$.fn.doesItTryToDoStuff = function() { 
    alert('called'); 

    // here I could have some wasteful process 
    // which could foolishly be executed 
    // even when there are no elements 


    return this.each(function() { 
     $(this).css("border", "1px solid red"); 
    }); 
}; 

$("input").filter("[value='foo']").doesItTryToDoStuff().doesItTryToDoStuff(); 

Demo.

Tôi mong rằng hầu hết các phương pháp jQuery được mã hoá như vậy mà không có gì quyết liệt xảy ra trước khi độ dài của bộ sưu tập đã được thử nghiệm, nhưng bạn không bao giờ biết.

+0

Đánh dấu câu trả lời này là câu trả lời được chấp nhận vì nó giải quyết được hiệu quả là câu hỏi của tôi thực sự là gì. – weenoid

3

Lọc trên thứ gì đó không tồn tại sẽ trả về bộ gói rỗng. Các bộ lọc tiếp theo sẽ được gọi nhưng sẽ không có hiệu lực.

$('div').filter('.isnt-here').end().filter('.spacer').length; 

Chạy trên trang câu hỏi trả về 25.

+0

Vì vậy, nó sẽ hiệu quả hơn để rời khỏi biểu thức như nó hoặc tách ra các cuộc gọi lọc() và kiểm tra độ dài sau mỗi cuộc gọi? – weenoid

+0

'filter' sử dụng' grep' nội bộ. Bạn có thể xem mã nguồn ở đây, ['filter'] (http://james.padolsey.com/jquery/#v=1.6.2&fn=jQuery.fn.filter) và [' grep'] (http: // james.padolsey.com/jquery/#v=1.6.2&fn=jQuery.grep). Tôi sẽ không quá lo lắng về việc có một vài bộ lọc bổ sung trừ khi tôi đã xác định nó như là một nút cổ chai trong ứng dụng của tôi. –

0

Lọc trong jQuery sẽ trả về đối tượng jQuery có danh sách các phần tử được so khớp DOM, bộ lọc tiếp theo sẽ được gọi trên các phần tử DOM đó, v.v.

Nếu không có kết quả phù hợp, lọc trong jQuery sẽ trả về đối tượng jQuery có danh sách rỗng và gọi bộ lọc tiếp theo cho danh sách trống, vì vậy nó sẽ không trả về kết quả phù hợp.

Nó cũng giống như thu hẹp phạm vi bộ lọc.

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