页面加载完成后执行的JavaScript代码通常放在window.onload
事件或DOMContentLoaded
事件中。如果这些事件被多次绑定,或者页面中有动态内容导致这些事件被重复触发,可能会导致JavaScript代码执行多次。
DOMContentLoaded
事件可以在DOM完全加载后立即执行脚本,而不必等待样式表、图像和子框架完成加载。问题:JavaScript代码在页面加载完成后执行多次。 原因:
function debounce(func, wait) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
window.addEventListener('load', debounce(() => {
console.log('Page loaded');
}, 200));
function onPageLoad() {
console.log('Page loaded');
window.removeEventListener('load', onPageLoad); // 移除事件监听器
}
if (window.addEventListener) {
window.addEventListener('load', onPageLoad);
} else if (window.attachEvent) { // 兼容IE
window.attachEvent('onload', onPageLoad);
}
let isPageLoaded = false;
window.addEventListener('load', () => {
if (!isPageLoaded) {
isPageLoaded = true;
console.log('Page loaded');
}
});
以下是一个简单的示例,展示了如何确保load
事件处理函数只执行一次:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
function onPageLoad() {
console.log('Page loaded');
window.removeEventListener('load', onPageLoad); // 移除事件监听器
}
if (window.addEventListener) {
window.addEventListener('load', onPageLoad);
} else if (window.attachEvent) { // 兼容IE
window.attachEvent('onload', onPageLoad);
}
</script>
</body>
</html>
通过上述方法,可以有效避免JavaScript代码在页面加载完成后执行多次的问题。
领取专属 10元无门槛券
手把手带您无忧上云