2014-04-20 3 views
0

HTML table을 검색하고 검색어에 따라 표시/숨기기를하는 "실시간 검색"상자가 있습니다.

작은 테이블에서는 완벽하게 작동하지만 테이블 데이터가 커지면 검색 속도가 느려집니다.

내 코드 :

$("#search").keyup(function() { 
     var raderna = $("#history tbody tr"); 
     var value = this.value.toLowerCase().trim(); 
      if(value.length == 0) { 

       raderna.each(function(index) { 
      if (index !== 0) { 
       $row = $(this); 
        if($row.hasClass("hiddenRow")) { 
         $row.hide(); 
        } else { 
         $row.show(); 
        } 
       } 
      }); 

       return false; 
     } 
     raderna.each(function (index) { 
      $(this).find("td").each(function() { 
       var id = $(this).text().toLowerCase().trim(); 
       var not_found = (id.indexOf(value) == -1); 
       $(this).closest('tr').toggle(!not_found); 
       return not_found; 
      }); 
     }); 
    }); 

내가 속도를 높이기 위해 무엇을 할 수 있는지 어떤 아이디어?

+0

테이블 행의 모든 ​​필드를 문자열로 연결하고 배열로 푸시하십시오. 이제이 배열을 루프하여 문자열을 검색 할 수 있습니다. – Tyranicangel

+0

만약 여러분이 angularjs를 사용할 수 있다면 그것을보십시오. ng-filter로 ng-repeat를 사용할 수 있다면이 과정은 정말 간단합니다. – Tyranicangel

+0

자바 스크립트 객체/배열을 사용하여 실시간 검색을 관리한다는 생각보다 두 번째로 생각합니다. DOM으로 작업하는 것은 일반적으로 변수를 직접 사용하는 것보다 훨씬 느립니다. 아마도 모든 테이블 데이터를 JSON 파일에 저장하고 페이지로드시 테이블에서 동적으로 테이블을 생성 할 수 있습니까? 아마도 페이지를 완전히로드하는 데 약간 느려지 겠지만 돌 한 개로 두 마리의 새를 죽일 수 있습니다. 빠른 조회가 가능하며 테이블의 내용이 변경되면 업데이트해야하는 파일이 하나뿐입니다. JSON은 HTML보다 읽기 쉽고 이식성이 좋습니다. – Serlite

답변

0
  1. 키 업 이벤트 위에 var raderna = $("#history tbody tr");을 넣으세요. 모든 키 이벤트로 DOM에서 #history tbody tr을 찾고 있으므로 쓸모가 없습니다. 페이지로드시이 작업을 한 번 수행하고 해당 변수에 유지할 수 있습니다.
  2. 클래스 hiddenRow의 스타일을 display: none으로하고 $row.hide()$row.show()을 호출하는 대신 $row.addClass() 또는 removeClass()을 사용할 수 있습니다. 요소를 표시하거나 숨기는 것보다 클래스를 추가하거나 제거하는 것이 더 빠릅니다. 또는 toggleClass()를 사용할 수도 있습니다.
  3. 이 각 : 나는 그것을 쓰는 동안

    $(this).find('td').each(function() { 
        var $this = $(this), 
         id = $this.text().toLowerCase(), 
         not_found = (id.indexOf(value) == -1); 
        $this.closest('tr').toggle(!not_found); 
        return not_found; 
    }); 
    

내가 @Tyranicangel 귀하의 질문에 댓글을 달았 내가 생각하는 것을 보았다 :이처럼 작성하는 경우

$(this).find("td").each(function() { 
    var id = $(this).text().toLowerCase().trim(); 
    var not_found = (id.indexOf(value) == -1); 
    $(this).closest('tr').toggle(!not_found); 
    return not_found; 
}); 

이 quickier 될 수 있습니다 두 가지 모두 그의 제안이 좋다. 나는 당신에게 당신의 코드의 성능을 향상시키기위한 작은 조언만을 주었다.