2013-05-23 4 views
1

jQuery 사용 .append 일부 html로 125px X 80px의 10,000px 격자를 만듭니다. 픽셀은 먼저 아래로 번호가 매겨집니다. 이제는 정상적으로 작동하지만 느린 속도로 페이지를로드하는 눈에 띄는 지연이 html로 바로 작성하는 것과 비교됩니다. 여전히 픽셀 번호 매기기를 유지하면서 속도를 높일 수 있습니까?HTML 테이블 생성 속도 향상

내 HTML은 다음과 같습니다

<div id="grid"> 
</div> 

자바 스크립트 : 전체 HTML을 생성하고 한 단계에서 DOM에 추가 성능을 개선하는 것 향한 첫 단계의

function createGrid() { 
var counter = 1; 
var rowCounter = 1; 
var divs = 10000; 
$('<table width="625px"><tr>').appendTo('#grid'); 
for (var i = 1; i <= divs; i++) { 
    if (i % 125 == 0){ 
     $('</ tr><tr>').appendTo('#grid'); 
     rowCounter++; 
     counter = rowCounter; 
    } 
    else 
     $('<td id="pixel_' + counter + '" class="pixel"></td>').appendTo('#grid'); 
     counter =+ 80; 
    } 
$('</tr></table>').appendTo('#grid'); 
} 
+2

코드에 큰 문제가 있습니다.이 완전히 잘못되었습니다! 성능 향상을 위해 문자열을 작성하고 추가하지 마십시오. – epascarello

+0

왜 그렇게하고 있니? 당신이 잘못된 방법으로 어떤 문제를 해결하려고하는 것처럼 들립니다. :) –

+0

제 3 자 코드 (jQuery)는 작동 원리를 모르는 경우 사용하지 마십시오. –

답변

4

.append()은 완전한 DOM 요소를 만들기 때문에 코드가 예상대로 작동하지 않습니다. $('<table width="625px"><tr>').appendTo('#grid')은 자동으로 두 태그를 모두 닫습니다. 다음 행을 표에 추가하고 셀을 행에 추가해야합니다.

이렇게되면 it's inefficient to constantly append elements to the DOM anyway이 발생합니다. 대신 테이블을 단일 문자열로 작성하고 한 번에 모두 작성하십시오. This is more efficient since you're only adding to the DOM one time.

function createGrid() { 
    var counter = 1; 
    var rowCounter = 1; 
    var divs = 10000; 
    var tstr = '<table width="625px"><tr>'; 
    for (var i = 1; i <= divs; i++) { 
     if (i % 125 == 0) { 
      tstr += '</ tr><tr>'; 
      rowCounter++; 
      counter = rowCounter; 
     } else 
      tstr += '<td id="pixel_' + counter + '" class="pixel"></td>'; 
     counter = +80; 
    } 
    tstr += '</tr></table>'; 
    $('#grid').append(tstr); 
} 

http://jsfiddle.net/mblase75/zuCCx/

+0

고마워요. 그것이 새로운 DOM 요소를 만들었다는 것을 깨닫지 못합니다 - 타이머가 허락하자마자 해결할 것입니다. – db579

+2

그것은 오해의 여지가 있습니다. 우리는 HTML 태그를 코딩하지만 브라우저는 DOM 요소를 이해하고 자바 스크립트 프로그래머가된다는 것은 웹 페이지가 어떻게 구성되어 있는지에 대한 생각을 바꾸고 있습니다. – Blazemonger

+0

고마워 - 내가 볼 소스를 클릭하면이 html 출력이 표시되지 않습니다. 그것은 이것과 어떤면에서 관련이 있습니까? – db579

0

하나.

function createGrid() { 
    var counter = 1; 
    var rowCounter = 1; 
    var divs = 10000; 
    var html = '<table width="625px"><tr>'; 
    for (var i = 1; i <= divs; i++) { 
     if (i % 125 == 0){ 
     html += '</ tr><tr>'; 
     rowCounter++; 
     counter = rowCounter; 
    } 
    else 
     html += '<td id="pixel_' + counter + '" class="pixel"></td>'; 
     counter =+ 80; 
    } 
    html += '</tr></table>'; 
    $('#grid').html(html); 
} 
+0

버그를 복사했습니다. '$ ('')' – epascarello

+0

@epascarello - 예, 지금 편집했습니다. :) – techfoobar

+0

'$ ('

') .appendTo ('# grid');' – jnylen

1
$('<table width="625px"><tr>') 

하지 쓰기와 HTML 문자열을 추가로 동일합니다! jQuery는 <table><tr> 문자열을 평가하고 DOMElement을 만듭니다. 즉,이 작은 코드로 DOM에 전체 테이블을 만들었습니다. 닫기 태그는 자동 완성되고 테이블이 인스턴스화됩니다. 그때부터는 추가 할 문자열이 아닌 DOM 객체로 작업해야합니다.

불완전하거나 자동 완성 된 작은 DOM 객체를 생성하기 때문에 코드가 느려질 수 있습니다.이 객체는 모두 올바른 구조로 묶여있을 수도 있습니다. DOM 객체를 매우 빠르게 조작해야합니다 (또는). 완전한 문자열을 구성하고 한 번 평가하십시오.