2011-08-30 23 views
8

Tôi đang bị lỗi bởi lỗi Chrome/Webkit 71305, nơi ẩn một số lượng lớn các nút khiến Chrome bị treo. (Cũng xảy ra trong Safari).Làm việc xung quanh để lọc trực tiếp hơn 1500 mục với jQuery trong Chrome

Tôi lọc một mục danh sách đó sẽ được trong một trình đơn thả xuống như sau:

jQuery.expr[':'].Contains = function(a, i, m) { 
    return $.trim((a.textContent || a.innerText || "")).toUpperCase().indexOf(m[3].toUpperCase()) == 0; 
}; 

var input = $('input'); 
var container = $('ul'); 

input.keyup(function(e) { 
    var filter = $.trim(input.val()); 

    if (filter.length > 0) { 
     // Show matches. 
     container.find("li:Contains(" + filter + ")").css("display", "block"); 
     container.find("li:not(:Contains(" + filter + "))").css("display", "none"); 
    } 
    else { 
     container.find('li').css("display", "block"); 
    } 
}); 

Snippet của đánh dấu:

<input type="text" /> 
<ul> 
    <li> 
     <div> 
      <span title="93252"><label><input type="checkbox">3G</label></span> 
     </div> 
    </li> 
</ul> 

Thời gian cần cho Javascript để thực hiện không đáng kể. Đó là khi Chrome cần vẽ lại các phần tử sau khi xóa văn bản trong số input mà nó bị treo. Không xảy ra trong FF6/IE7-9.

tôi đã thực hiện một JSFiddle để minh họa cho vấn đề này: http://jsfiddle.net/uUk7S/17/show/

Có cách tiếp cận khác tôi có thể mất chứ không phải che giấu và hiển thị các yếu tố đó sẽ không gây Chrome để treo? Tôi đã cố gắng nhân bản các ul, xử lý trong clone và thay thế các ul trong DOM hoàn toàn với bản sao, nhưng tôi hy vọng có một cách tốt hơn vì điều này là chậm hơn đáng kể trong IE.

+0

bạn đang thiếu khung đóng cho các phần tử 'span'. Liệu đó có phải là nguyên nhân không? –

+0

@ William, đó chỉ là một sai lầm tôi đã thực hiện khi làm sạch các đánh dấu trong Vim. Tôi sẽ sửa lỗi nhưng vấn đề vẫn tồn tại. (Đặc biệt vì nó hoạt động tốt trong các trình duyệt khác). – Soliah

Trả lời

7

Bạn đã thử khả năng css khác để ẩn các thành phần chưa?

Sử dụng đạo cụ css như công tắc visibility? Hoặc chuyển đổi giữa height:autoheight:0;overflow-y:hidden;?

Tôi đã tạo một ví dụ nhỏ here, sử dụng .css({"visibility":"visible","height":"auto"}); để hiển thị và ({"visibility":"hidden","height":"0"}) để ẩn. Và nó có vẻ làm việc tốt trong chrome trong vài thử nghiệm tôi đã làm.

EDIT: Thậm chí tốt hơn here, bạn chỉ cần sử dụng .css("visibility","visible");.css("visibility","hidden");. Việc sử dụng li[style~="hidden;"]{height:0;} đang thực hiện sửa đổi chiều cao cho bạn.

+0

Thay đổi chiều cao là cách tiếp cận tôi sắp đăng. Làm việc tốt cho tôi. –

+0

Điều này hoạt động tốt! Lưu ý rằng nếu có bất kỳ 'padding' nào được thêm vào các phần tử đã lọc, thì cũng cần phải được đặt thành' 0' trong kiểu. – Soliah

-1

Thực tế, bạn có thể đặt giá trị trống cho thành phần <li>. Điều đó thực sự là chỉ sửa chữa tôi đã có thể làm việc. Và khi bạn cần giá trị một lần nữa, hãy đặt nó trở lại. Hoặc bạn có thể xóa <li>. Nhưng tôi càng có nhiều tiền đề cho điều đó, để sử dụng AJAX.

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