안녕하세요.setimeout 후 removeChild가 산발적으로 작동합니까?
body 클래스가 "loaded"로 변경 될 때 1000ms 지속되는 CSS 전환 (불투명도)을 통해 페이드 아웃 된 로더가 있고 전환이 완료되면 나는 DOM.
바 osx 스노우 레오파드/구글 크롬 v28 모두에서 잘 작동하는 다음 스크립트를 사용 중입니다. 심지어 몇 명의 사람들 만 사용할 수 있습니다. 내 클라이언트와 거의 모든 사람들이 똑같은 설정을했습니다. 나는 시험 할 수있다 - 그리고 그것은 잘 작동한다.
하지만 로더가 DOM에서 제거되지 않는 버그보고가 2 개 또는 3 개 있었기 때문에 나머지 콘텐츠를 여전히 오버레이하여 그 아래에있는 요소를 클릭 할 수 없게 만듭니다. 한 종류의 사용자는 심지어 로더 요소가 여전히 DOM에 있음을 확인하는 비디오를 보냈습니다.
스크립트는 다음과 같습니다. 나는 그 요소를 어떻게 제거했는지 또는 setTimeout 함수 구문 자체에 문제가있을 수 있는지 궁금하다.
왜 이것이 아마도 실패 할 수 있는지에 대한 도움이 필요합니다. 특히 이것을 복제 할 수 없다고 생각하면 좋습니다! 스크립트에서 어떻게 작동하는지 (그리고 대부분은 어떻게 작동하는지) 설명하는 주석을 추가했습니다.
var
loaded = false,
_body = document.body,
loader = document.getElementById("loader"),
kill_loader = function() {
if (loader) {
loader.parentNode.removeChild(loader);
}
},
cl = function() {
// set loaded to true, add class to body that fades the loader, then remove the loader
loaded = true;
_body.className = _body.className + " loaded";
// the above works as intended
setTimeout(kill_loader,1000);
// this last bit does not seem to work in rare instances as detailed.
// the timeout is so that the loader fully fades before being removed.
};
window.onload = function() {
if (!loaded) {
// if loaded variable is false (i.e. cl() has not run), call the function to complete loading
cl();
}
};
setTimeout(function() {
// if page still not loaded after 5 seconds, force the load
if(!loaded) {
cl();
}
},5000);
미리 도움을 주셔서 감사합니다.
복제 할 수 없다면 사용자에게 콘솔 오류를보고하도록 요청할 수 있습니까? 귀하의 변수가 글로벌입니까? –
... 이건 직접 관련이 없지만, 형식 상으로는'if (! loaded) {'를'cl()'함수로 옮겨서 반복하지 않아도됩니다. 그런 다음'window.onload = cl'과'setTimeout (cl, 5000)'을 할 수 있습니다. –
이 코드는 준비된 함수에 있습니까? 그 문제가 어쩌면 "로더"가 null인지 아닌지 궁금합니다. 그 이유는 어떤 이상한 경우 HTML이 아직 렌더링되지 않았기 때문입니다. 이 스크립트는 페이지의 어디에 있습니까? html 이후입니까? –