문서가로드 된 후 함수를 호출하려고하지만 문서가 아직로드되지 않았을 수도 있습니다. 로드되면 함수를 호출 할 수 있습니다. 로드되지 않으면 이벤트 리스너를 연결할 수 있습니다. 호출되지 않으므로 onload가 이미 실행 된 후에 이벤트 리스너를 추가 할 수 없습니다. 문서가로드되었는지 어떻게 확인할 수 있습니까? 아래 코드를 시도했지만 완전히 작동하지는 않습니다. 어떤 아이디어?
var body = document.getElementsByTagName('BODY')[0];
// CONDITION DOES NOT WORK
if (body && body.readyState == 'loaded') {
DoStuffFunction();
} else {
// CODE BELOW WORKS
if (window.addEventListener) {
window.addEventListener('load', DoStuffFunction, false);
} else {
window.attachEvent('onload', DoStuffFunction);
}
}
답변
galambalazs가 언급 한 모든 코드가 필요하지 않습니다. 순수한 JavaScript로 브라우저 간을 수행하는 방법은 단순히 테스트하는 것입니다 document.readyState
.
if (document.readyState === "complete") { init(); }
이것은 jQuery가 수행하는 방식이기도합니다.
JavaScript가로드되는 위치에 따라 간격 내에서 수행 할 수 있습니다.
var readyStateCheckInterval = setInterval(function() {
if (document.readyState === "complete") {
clearInterval(readyStateCheckInterval);
init();
}
}, 10);
실제로 document.readyState
세 가지 상태를 가질 수 있습니다.
문서를로드하는 동안 “로드 중”, 구문 분석이 완료되었지만 하위 리소스를로드 한 후에는 “대화식”,로드 된 후에는 “완료”를 반환합니다. – 모질라 개발자 네트워크에서 document.readyState
따라서 DOM 만 준비해야하는 경우를 확인하십시오 document.readyState === "interactive"
. 이미지를 포함하여 전체 페이지를 준비해야하는 경우를 확인하십시오 document.readyState === "complete"
.
답변
도서관이 필요 없습니다. jQuery는이 스크립트를 잠시 동안 사용했습니다 (btw).
http://dean.edwards.name/weblog/2006/06/again/
// Dean Edwards/Matthias Miller/John Resig
function init() {
// quit if this function has already been called
if (arguments.callee.done) return;
// flag this function so we don't do the same thing twice
arguments.callee.done = true;
// kill the timer
if (_timer) clearInterval(_timer);
// do stuff
};
/* for Mozilla/Opera9 */
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", init, false);
}
/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
if (this.readyState == "complete") {
init(); // call the onload handler
}
};
/*@end @*/
/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
var _timer = setInterval(function() {
if (/loaded|complete/.test(document.readyState)) {
init(); // call the onload handler
}
}, 10);
}
/* for other browsers */
window.onload = init;
답변
JS 프로그래밍을 더 쉽게 만드는 jQuery와 같은 것을 사용하고 싶을 것입니다.
다음과 같은 것 :
$(document).ready(function(){
// Your code here
});
당신이하고있는 일을하는 것 같습니다.
답변
if(document.readyState === 'complete') {
DoStuffFunction();
} else {
if (window.addEventListener) {
window.addEventListener('load', DoStuffFunction, false);
} else {
window.attachEvent('onload', DoStuffFunction);
}
}
답변
실제로이 코드가 domready가 아닌 load 에서 실행되도록 하려면 (즉, 이미지도로드해야 함) 불행히도 ready 함수는이를 수행하지 않습니다. 나는 일반적으로 다음과 같은 일을합니다.
문서 자바 스크립트에 포함합니다 (즉, 항상 onload 발생 전 호출).
var pageisloaded=0;
window.addEvent('load',function(){
pageisloaded=1;
});
그런 다음 코드 :
if (pageisloaded) {
DoStuffFunction();
} else {
window.addEvent('load',DoStuffFunction);
}
(또는 선호하는 프레임 워크에서 이에 해당합니다.)이 코드를 사용하여 향후 페이지에 대한 자바 스크립트 및 이미지 사전 처리를 수행합니다. 내가 받고있는 것들이이 페이지에 전혀 사용되지 않기 때문에 빠른 이미지 다운로드보다 우선하지 않기를 바랍니다.
더 좋은 방법이 있지만 아직 찾지 못했습니다.
답변
모질라 파이어 폭스는 이것이 onreadystatechange
대안 이라고 말한다 DOMContentLoaded
.
// alternative to DOMContentLoaded
document.onreadystatechange = function () {
if (document.readyState == "complete") {
initApplication();
}
}
에서 DOMContentLoaded
Mozila의 문서는 말합니다 :
DOMContentLoaded 이벤트는 스타일 시트, 이미지 및 서브 프레임이로드를 완료 할 때까지 기다리지 않고 문서가 완전히로드되고 구문 분석 될 때 시작됩니다 (로드 이벤트는 완전히로드 된 페이지를 감지하는 데 사용될 수 있음).
load
이벤트는 전체 문서 + 리소스로드에 사용해야 한다고 생각 합니다.
답변
위의 JQuery를 사용하는 것이 가장 쉽고 가장 많이 사용되는 방법입니다. 그러나 순수한 자바 스크립트를 사용할 수 있지만 처음에 읽히도록이 스크립트를 헤드에 정의하십시오. 당신이 찾고있는 것은 window.onload
이벤트입니다.
아래는 카운터를 실행하기 위해 만든 간단한 스크립트입니다. 그런 다음 카운터는 10 회 반복 후 중지됩니다.
window.onload=function()
{
var counter = 0;
var interval1 = setInterval(function()
{
document.getElementById("div1").textContent=counter;
counter++;
if(counter==10)
{
clearInterval(interval1);
}
},1000);
}