가장 쉬운 방법은 코드를 클로저로 래핑하고 전역 적으로 필요한 변수 만 전역 범위에 수동으로 노출하는 것입니다.
(function() {
window['varName'] = varName;
})();
Crescent Fresh의 의견을 해결하기 위해 : 시나리오에서 전역 변수를 완전히 제거하기 위해 개발자는 질문에서 가정 한 여러 가지를 변경해야합니다. 다음과 같이 보일 것입니다.
자바 스크립트 :
(function() {
var addEvent = function(element, type, method) {
if('addEventListener' in element) {
element.addEventListener(type, method, false);
} else if('attachEvent' in element) {
element.attachEvent('on' + type, method);
} else if('on' + type in element) {
var oldMethod = element['on' + type],
newMethod = function(e) {
oldMethod(e);
newMethod(e);
};
} else {
element['on' + type] = method;
}
},
uploadCount = 0,
startUpload = function() {
var fil = document.getElementById("FileUpload" + uploadCount);
if(!fil || fil.value.length == 0) {
alert("Finished!");
document.forms[0].reset();
return;
}
disableAllFileInputs();
fil.disabled = false;
alert("Uploading file " + uploadCount);
document.forms[0].submit();
};
addEvent(window, 'load', function() {
var frm = document.forms[0];
frm.target = "postMe";
addEvent(frm, 'submit', function() {
startUpload();
return false;
});
});
var iframe = document.getElementById('postHere');
addEvent(iframe, 'load', function() {
uploadCount++;
if(uploadCount > 1) {
startUpload();
}
});
})();
HTML :
<iframe src="test.htm" name="postHere" id="postHere"></iframe>
에 인라인 이벤트 핸들러 가 필요 하지 않으며이 <iframe>
코드를 사용하여 각로드에서 계속 실행됩니다.
로드 이벤트 관련
다음은 인라인 onload
이벤트 가 필요하지 않음을 보여주는 테스트 사례 입니다. 이것은 동일한 서버에서 파일 (/emptypage.php)을 참조하는 것에 달려 있습니다. 그렇지 않으면 이것을 페이지에 붙여넣고 실행할 수 있어야합니다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>untitled</title>
</head>
<body>
<script type="text/javascript" charset="utf-8">
(function() {
var addEvent = function(element, type, method) {
if('addEventListener' in element) {
element.addEventListener(type, method, false);
} else if('attachEvent' in element) {
element.attachEvent('on' + type, method);
} else if('on' + type in element) {
var oldMethod = element['on' + type],
newMethod = function(e) {
oldMethod(e);
newMethod(e);
};
} else {
element['on' + type] = method;
}
};
var iframe;
try {
iframe = document.createElement('<iframe name="postHere">');
} catch (e) {
iframe = document.createElement('iframe');
iframe.name = 'postHere';
}
iframe.name = 'postHere';
iframe.id = 'postHere';
iframe.src = '/emptypage.php';
addEvent(iframe, 'load', function() {
alert('iframe load');
});
document.body.appendChild(iframe);
var form = document.createElement('form');
form.target = 'postHere';
form.action = '/emptypage.php';
var submit = document.createElement('input');
submit.type = 'submit';
submit.value = 'Submit';
form.appendChild(submit);
document.body.appendChild(form);
})();
</script>
</body>
</html>
Safari, Firefox, IE 6, 7 및 8에서 제출 버튼을 클릭 할 때마다 경고가 발생합니다.