스크롤 이벤트에서 javascript에 관한 이상한 것을 알게되었습니다.이벤트 콜백 전에 interval 함수가 실행되는 이유는 무엇입니까?
지금까지 스크롤 위치가 변경 될 때마다 직접 해고 될 것이라고 확신했습니다.
자바 스크립트가 블로킹하기 때문에 콜백이 항상 실행되고 첫 번째 기능이이 새로운 값을 "보게"됩니다.
여기 간단한 설정이 있습니다. 여기서 전역 값은 스크롤의 현재 스크롤 위치로 업데이트됩니다. 두 개를 비교하는 간격이 있습니다.
매우 빠르게 스크롤하면 캐시 된 값이 실제 반환 된 스크롤 위치와 같지 않은 경우가 종종 발생합니다.
// cache scroll pos
var scrollPos = 0;
// update on scroll
window.onscroll = function() {
scrollPos = scrollTop();
};
// compare on interval
setInterval(function() {
if (scrollPos != scrollTop()) {
console.log("Out of sync! cached:", scrollPos, "| actual:", scrollTop());
}
}, 100);
바이올린 : 당신은 신속하게 주위로 스크롤 버튼을 사용하여 시도 할 수 있습니다 http://jsfiddle.net/71vdx4rv/2/
. [Chrome, Safari, FF, Opera에서 테스트]
콜백이 수행되기 전에 간격 기능이 실행되고 '새'스크롤 위치를 알고있는 이유는 무엇입니까?
누군가 나에게 설명해 주시겠습니까?
onscroll이 계속해서 실행되지 않으므로 타이머가 업데이트 사이에서 실행할 수 있습니다. – epascarello
아니요, 이것이 원인이 아닙니다. 물론 타이머는 업데이트 사이에서 실행할 수 있지만 항상 스크롤 이벤트 콜백 후 새 스크롤 pos 값을 가질 것이라고 생각했습니다. 이유가 무엇인지 알 수있는 대답을 참조하십시오. –
야, 내 의견은 베르 기가 말한 것의 일반적인 요지이다. onscroll! == 페이지의 실제 이동과 1 대 1의 관계로, 이는 지속적인 플로우 업 업데이트가 아님을 의미합니다. 예. – epascarello