나는 상대적으로 위치가 정해진 요소를 현재 위치에서 1000px 벗어나 슬라이드하는 다음과 같은 기능을 가지고 있습니다.JavaScript 함수 및 UI 업데이트
for (var i = 0; i < 1000; i++) {
$('.my-element').css(
'left',
parseInt($('.my-element').css('left'), 10) + 1
);
}
이것은 슬라이딩 효과를 생성하지 않습니다. 오히려 실행이 끝날 때까지 요소는 갑자기 1000px 오른쪽으로 이동합니다.
이제 I는 다음과 같이의 setTimeout에서 UI 업데이트를 감싸는 경우 :
는for (var i = 0; i < 1000; i++) {
setTimeout(function() {
$('.my-element').css(
'left',
parseInt($('.my-element').css('left'), 10) + 1
);
}, 0);
}
이 그 오른쪽 1000px 슬라이딩 요소의 시각적 효과를 생성한다.
내 스레드 및이 SO 스레드 Why is setTimeout(fn, 0) sometimes useful?에 따르면 UI 업데이트는 setTimeout 콜백처럼 대기중인 async 콜백과 동일한 방식으로 브라우저 이벤트 큐에 대기합니다.
그래서 기본적으로 for 루프가 실행될 때 기본적으로 1000 개의 UI 업데이트 대기열이 만들어집니다.
그리고 두 번째로 먼저 1000 개의 setTimeout 콜백 큐가 생성됩니다.이 큐는 실행시 1000 개의 UI 업데이트 큐를 새로 만듭니다.
결국 결국 두 경우 모두 1000 개의 UI 업데이트 대기열을 만듭니다. 그렇다면 시각적 인 결과의 차이점은 무엇입니까?
여기서는 중요한 JavaScipt 및 브라우저 렌더링 개념을 살펴보아야합니다. 나를 계몽 할 수있는 사람은 누구나 감사 할 것입니다.
참고 : 위 예제는 전적으로 목적을 이해하는 데 사용되며 DOM 요소를 슬라이드하기위한 JS 함수를 만들려는 시도가 아닙니다.
로건은 확실히 당신의 질문에 대한 대답,하지만 난 루프 대신 슬라이딩 효과를 수행하기 위해 [jQuery.animate] (http://api.jquery.com/animate/)에보고 제안했다. 그냥 for 루프의 모든 반복은 DOM을 가로 지르며'.my-element'의 클래스를 가진 모든 엘리먼트를 찾는다 고 생각합니다 - 거의 효율적이지 않습니다! – chazsolo
이 예제는 브라우저가 JavaScript를 실행하고 UI를 업데이트하는 방법을 이해하기위한 것입니다. 슬라이딩 기능을 만들려는 시도가 아닙니다. – Prashant