내가 개발해온 응용 프로그램의 UI에서 특정 (동기식) 처리가 시작되고 처리가 끝난 후에 숨기기 전에 "로더"div를 표시하려고했습니다. 그러나 전체 처리 중에는 로더가 전혀 나타나지 않습니다.Javascript가 실행되는 동안 브라우저의 리플 로우가 트리거되지 않는 이유는 무엇입니까?
가능한 경우 브라우저는 불필요한 리플 로우를 제거하여 렌더링 프로세스를 최적화하려고합니다. 리플 로우 프로세스를 수동으로 실행할 수있는 몇 가지 방법이 있지만 (예 : 광산과 같은 경우), 그 중 일부는 작동시키지 못했습니다. 다음은 offsetHeight의 계산이 리플 로우를 유발하는 데 사용되지만 TEST div가 전혀 나타나지 않는 최소한의 예제입니다. 요소
- 는 offsetHeight의 계산 :
<html> <head> <script src="https://code.jquery.com/jquery-2.2.4.js"></script> </head> <body> <div id="test" style="display:none; background-color:red; height:500px">TEST</div> <script> function reflow() { var t = $("#test")[0].offsetHeight; $(window).trigger('resize'); window.getComputedStyle($("#test")[0], null); $("#test").focus(); } $("#test").show(); reflow(); console.log("Processing started"); var sum = 0; for(i = 0; i < 100000000; i++) { sum += i; } console.log("Processing ended"); $("#test").hide(); <script> </body> </html>
작업 JSFiddle도
있는 몇 가지 방법 here은 (스크립트에서 볼 수 있듯이) 다음과 같다 리플 로우를 강제로 시도 크기 조정
- window.getComputedStyle()
- 요소의 초점
참고 : 시간 초과를 추가하여 해결할 수 있습니다. 그러나 타임 아웃은 "해킹"이므로이 기능에 적합하지 않기 때문에 리플 로우를 강제하는 방법을 찾고 싶습니다.
js가 단일 스레드 언어 이상인 문제가 있습니다. 실제 사용 사례에 따라 지연시킬 수 있습니다. https://jsfiddle.net/37feyy6b/2/ 또는 웹 작업자 –
* 시도한 방법은 무엇입니까? 지정하지 않으면 동일한 조언을 다시 받아야합니다. – JJJ
@Juhana, 나는 내가 실패한 시도의 일부를 추천했다. – Dimos