IE8에서 script 탭을 동적으로 만드는 올바르지 않은 해결 방법
오늘 프로젝트를 진행하는데, 동적으로 만든script 탭이 IE8에서 onload 이벤트를 터치할 수 없는 이상한 문제를 발견했습니다.
코드는 다음과 같습니다.
var loadJs = function(src, fun){
var script = null;
script = document.createElement("script");
script.type = "text/javascript";
script.src = src;
if(typeof fun === "function"){
script.onload = fun;
}
document.getElementsByTagName("head")[0].appendChild(script);
};
loadJs("js/jquery-1.11.0.min.js", function(){
console.log("From jQuery");
});
loadJs("test.js", function(){
console.log("From test.js");
});
test.js:
console.log(typeof jQuery);
실행 결과:
undefined // test.js ,jQuery
>> typeof jQuery // , jQuery ,
"function"
그리고 위 코드에서script.onload는 실행되지 않았습니다. 코드가 불러왔는데 왜 onload가 실행되지 않습니까?인터넷에 검색해 보니 많은 전방 개발자들이 이 까다로운 문제에 부딪혔기 때문에 다음과 같은 후보 방안을 찾았다.
var loadJs = function(src, fun){
var script = null;
script = document.createElement("script");
script.type = "text/javascript";
script.src = src;
if(typeof fun === "function"){
script.onreadystatechange = function() {
var r = script.readyState;
console.log(src + ": " + r);
if (r === 'loaded' || r === 'complete') {
script.onreadystatechange = null;
fun();
}
};
}
document.getElementsByTagName("head")[0].appendChild(script);
};
실행 결과:
undefined
js/jquery-1.11.0.min.js: loading
test.js: complete
From test.js
js/jquery-1.11.0.min.js: loaded
From jQuery
실행 절차는 onload와 유사한 기능을 찾은 셈이지만, 문제가 하나 있습니다. 이것은 순서대로 불러오는 것이 아닙니다. jQuery 파일loading일 때test.js는 이미complete이고 첫 줄에서test를 실행했습니다.js의 내용.테스트 때문에.js가 jQuery보다 먼저 실행되기 때문에 undefined를 칩니다.따라서 선형 로드를 위해 다음과 같이 재정의할 수 있습니다.
loadJs("js/jquery-1.11.0.min.js", function(){
console.log("From jQuery");
loadJs("test.js", function(){
console.log("From test.js");
});
});
실행 결과:
js/jquery-1.11.0.min.js: loading
js/jquery-1.11.0.min.js: loaded
From jQuery
function
test.js: complete
From test.js
이번에 집행하는 순서는 완전히 우리가 예약한 순서에 따랐지만 상기 코드는 보기에 매우 어색하고 겹겹이 끼워 넣어야 하기 때문에 이런 문법을 발견했다.
var loadJs = function(src, fun){
var script = null;
script = document.createElement("script");
script.type = "text/javascript";
script.src = src;
if(typeof fun === "function"){
script.onreadystatechange = function() {
var r = script.readyState;
console.log(src + ": " + r);
if (r === 'loaded' || r === 'complete') {
script.onreadystatechange = null;
fun();
}
};
}
document.write(script.outerHTML);
//document.getElementsByTagName("head")[0].appendChild(script);
};
loadJs("js/jquery-1.11.0.min.js", function(){
console.log("From jQuery");
});
loadJs("test.js", function(){
console.log("From test.js");
});
결과 실행 순서도 다릅니다.
function
js/jquery-1.11.0.min.js: loaded
From jQuery
test.js: loaded
From test.js
하면, 만약, 만약...
loadJs("test.js", function(){
console.log("From test.js");
});
loadJs("js/jquery-1.11.0.min.js", function(){
console.log("From jQuery");
});
실행 결과도 다음과 같이 순서대로 로드됩니다.
undefined
test.js: loaded
From test.js
js/jquery-1.11.0.min.js: loaded
From jQuery
본고에서 말한 바와 같이 여러분의 자바스크립트 프로그램 설계에 도움이 되었으면 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.