2012-07-10 32 views
5

Tôi có một số mã mà hoạt động tốt nhưng nó trở nên quá chậm:jQuery: đếm các yếu tố có thể nhìn thấy - hiệu quả/vấn đề tốc độ

HTML:

Tôi có một container chứa khoảng 50 ul yếu tố. Mỗi thành phần ul có tiêu đề h4 theo sau là một loạt các phần tử li. Chức năng ẩn tiêu đề nếu không nhìn thấy các phần tử đường kẻ.

Javascript/jQuery:

  function show_or_hide_headings() { 
       $('#container').children('ul').each(function (i) { 
        var $this = $(this), 
         $h4 = $this.children(':first'); 
        if ($this.children('li:visible').length) { 
         $h4.show(); 
        } else { 
         $h4.hide(); 
        } 
       }); 
      } 

Nó được làm việc khá chấp nhận được cho đến khi tôi đã thay đổi bản chất của li yếu tố. Mỗi li giờ đây là một bảng nhỏ bao gồm <table><tr><td>icon</td><td>text</td></tr></table>. Bây giờ nó mất 2 giây để xử lý, trong khi nó đã làm việc trong chưa đầy nửa giây. (Bảng ở đó để dừng gói văn bản dưới biểu tượng.)

Tôi thú nhận tôi không thể hiểu tại sao việc thêm các phần tử bổ sung vào mỗi li sẽ làm chậm quá trình xử lý DOM rất nhiều vì tôi đã sử dụng .children bộ chọn để chỉ đi sâu một lớp DOM.

Tôi cũng đã thử:

   $('#container').find('h4').each(function (i) { 
        var $this = $(this); 
        if ($this.siblings('li:visible').length) { 
         $this.show(); 
        } else { 
         $this.hide(); 
        } 
       }); 

$('#container').children().children('h4') cho biện pháp tốt.

Điều đáng chú ý là khi có nhiều thành phần hiển thị, nó sẽ chậm hơn nhiều so với khi có thể nhìn thấy một vài phần tử. Tuy nhiên, không có nhiều dòng nào hơn khi nó hoạt động khá nhanh (tức là, trước khi bảng được đưa vào mỗi dòng).

Bất kỳ lời khuyên nào được đánh giá cao, nhưng vui lòng không yêu cầu tôi đăng nhiều mã hơn tôi có :)

Cảm ơn.

+1

Bạn cần đăng một ví dụ về đánh dấu có liên quan, từ những gì bạn đã nói, nó có vấn đề. Một [UL] (http://www.w3.org/TR/html5/the-ul-element.html#the-ul-element) có thể ** chỉ ** có phần tử con LI, H4 là lỗi- sửa chữa để bạn không có cấu trúc bạn nghĩ bạn làm. Ngoài ra, bảng để định dạng nội dung của LI là không cần thiết, hãy sử dụng CSS. Oh, và H4 không thể có LI là nút con, chúng phải có cha mẹ UL hoặc OL. – RobG

+0

Làm thế nào về nowrap thay vì bảng? Ngoài ra tại sao không giấu h4 cha mẹ khi bạn ẩn các trẻ em thay vì cách khác xung quanh? – mplungjan

+0

OK, cảm ơn. Tôi sẽ kiểm tra đánh dấu và lấy lại cái này. – Nick

Trả lời

2

Tôi nghi ngờ rằng việc xác định xem một phần tử có hiển thị hay không là khá đắt. Thay vào đó, hãy cân nhắc việc thêm và xóa lớp để ẩn hoặc hiển thị phần tử. Sau đó, bạn có thể chọn chúng trực tiếp dựa trên lớp, chủ yếu sẽ được hỗ trợ bởi máy chủ getElementsByClassName hoặc querySelectorAll.

+0

Đây là nền tảng của mớ hỗn độn mà tôi đang ở! Tôi * đang ẩn nấp và trưng bày mọi thứ theo nhiều lớp khác nhau, nhưng bây giờ tôi cần phải xác định xem có gì vẫn đang hiển thị không :) Điều khác là nó không đắt đến mức tôi đặt bàn vào hàng. Đó là câu hỏi thực sự. Tôi có thể tháo bàn và nó hoạt động tốt. – Nick

+0

Tôi đã đánh dấu câu trả lời để nhận ra lời khuyên tốt ở đây và trong phần bình luận ở trên, mặc dù không ai trả lời câu hỏi như tôi đã hỏi :) Tôi đã lấy bảng và định dạng lại đánh dấu hoạt động xung quanh vấn đề khỏe. – Nick

2

thử:

$('h4', '#container').css('display', 'none').filter(function() { 
    return $(this).siblings('li:visible').length; 
}).css('display', 'block'); 

nhưng tôi đồng ý với RobG, đánh dấu you'r có lẽ là không chính xác.

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