2009-08-06 3 views
2

많은 dom 노드 (> 5000)의 CSS 표시 ('블록', '없음')를 변경하는 javascript 기능이 있습니다. 나는 가능한 한 빨리 이것을 만들려고 노력하고있다.IE, Javascript and Reflow

IE가 자바 스크립트를 리플 로우하여 화면을 그립니다. 그렇지 않으면 javascript 엔진이 브라우저로 컨트롤을 반환 할 때까지 기다릴 것입니까? 나는 모든 노드가 자신의 디스플레이 세트를 가질 때까지 브라우저에서 추가 작업을 피하고자한다.

나는 JQuery와의 쇼에서 발견() 메소드는, DOM 조작이 주석으로 꽉 루프에 배치됩니다

// 두 번째 루프의 요소의 표시가
// 상수 리플을 방지하기 위해 설정

(http://code.google.com/p/jqueryjs/source/browse/trunk/jquery/src/fx.js 라인 51)

감사합니다,

제임스

답변

0

공통 상위 항목을 숨긴 다음 요소를 숨긴 다음 부모를 표시하면 불필요하게 다시 칠하지 못하게됩니다.

+0

사용자가 깜박임을 볼 것인가? javascript가 끝날 때까지 브라우저가 페인트하지 않을까요? – James

+0

몇 가지 테스트를 실시했는데 성능이 저하 된 것 같습니다. 크롬은 29ms-> 30ms, IE8 432ms-> 493 – James

0

JS는 각 요소를 변경하면서 브라우저가 페이지를 리플 로우합니다. 제안대로, 끝까지 디스플레이를 계속 변경하는 것이 가장 좋습니다. 이것은 또한 사용자에게 더 부드럽고 (실제로는 아닐지라도) 더 빨라질 것입니다.

나는 것 :

  1. 복제 당신이 처리 할 노드를 래핑하는 노드입니다.
  2. 복제 된 노드 children에 대한 처리를 수행하십시오.
  3. 원본 노드를 복제본으로 바꿉니다.

처리가 오랜 시간 (초 0.5) 사용자가 뭔가가 일어나고 있음을 알려 디스플레이에 뭔가를 설정하는 것이 좋습니다 걸리는 경우. 원본 콘텐츠를 천천히 약 50 %의 불투명도로 천천히 페이드 아웃하는 것이 간단한 방법입니다.

+1

이되었습니다. 아마도 내가 작성한 내용을 오해하고 있습니다.하지만 JavaScript가 실행되는 동안 브라우저가 시각적으로 변경되지 않습니다. JS는 통제권을 포기해야합니다. 그래서 SetTimeout()을 너무 오랫동안 지속되는 JS와 함께 사용해야합니다. JS가 브라우저로 제어권을 반환하지 않으면 대부분의 브라우저에서 (심지어 전부는 아님) 애니메이션 GIF조차도 멈 춥니 다. – Nosredna

+0

흠, 좋아, 어쩌면 내가 혼란스러워 질지도 모른다. 수정 해 주셔서 감사합니다 – edeverett

2

CSS를 사용하면 상위 요소의 클래스 이름을 변경하여 요소를 표시하거나 숨길 수 있습니다. 잠시 후에했던 몇 가지 테스트에서 각 요소의 display 속성을 설정하는 것보다 약 10 배 빠르다는 것을 알 수있었습니다. 단일 속성 만 변경하면 한 번 리플 로우됩니다.

예 :

<style> 
.State1 .InitiallyHidden { display: none; } 
.State2 .InitiallyShown { display: none; } 
</style> 

<script> 
function flip() { 
    var o = document.getElementById('Parent'); 
    o.className = o.className = 'State1' ? 'State2' : 'State1'; 
} 
</script> 

<input type="button" value="flip" onclick="flip();" /> 

<div id="Parent" class="State1"> 
    <div class="InitiallyHidden">One</div> 
    <div class="InitiallyShown">Two</div> 
    <div class="InitiallyHidden">Three</div> 
    <div class="InitiallyShown">Four</div> 
</div> 
+0

올바른 방법입니다. 5000 노드를 변경하면 뭔가 잘못 됐습니다. – mwilcox