onload在<body>上不推荐,因只能绑定一个处理函数且会被后续window.onload赋值覆盖;应改用addEventListener('load', ...)或DOMContentLoaded事件。

onload 在 <body> 上不是推荐的现代写法,它能用,但有明确缺陷:只能绑定一个处理函数,且会覆盖其他同类型注册(比如后续 JS 里写的 window.onload)。
为什么 body onload 容易被覆盖或失效
HTML 解析是线性的,<body onload="fn1()"> 本质是给 window 对象设置 onload 属性。一旦后续 JS 执行了 window.onload = fn2,fn1 就彻底丢失 —— 没有报错,也不提示,静默失效。
- 多个
onload声明时,后出现的会覆盖前面的(包括内联属性和 JS 赋值) - 如果页面中先写了
<body onload="init()">,又在底部<script>window.onload = handleAnalytics</script>,只有handleAnalytics运行 - 不支持事件监听器语义,无法用
addEventListener('load', ...)补充或解绑
window.addEventListener('load', ...) 是更安全的替代方案
load 事件真正触发时机是整个页面资源加载完成(含图片、CSS、脚本、iframe 等),这点和 body onload 一致,但注册方式更健壮。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 可多次调用
addEventListener,所有回调都会执行 - 支持
{ once: true }选项,避免重复绑定 - 兼容所有现代浏览器,包括 IE9+
- 示例:
window.addEventListener('load', () => {<br> console.log('所有资源已就绪');<br> document.getElementById('main').style.opacity = '1';<br>}, { once: true });
需要 DOM 就绪但不等图片加载?用 DOMContentLoaded
如果逻辑只依赖 HTML 结构(比如操作按钮、表单),不需要等图片、字体、外部 CSS 加载完,DOMContentLoaded 更快、更合适。
立即学习“前端免费学习笔记(深入)”;
- 触发时机早于
load,通常快几百毫秒到几秒(尤其在带大图的页面) - IE9+ 和所有现代浏览器都支持
- 注意:CSS 文件阻塞
DOMContentLoaded,但内联样式或已缓存的 CSS 不影响 - 示例:
document.addEventListener('DOMContentLoaded', () => {<br> const btn = document.querySelector('#submit-btn');<br> if (btn) btn.disabled = false;<br>});
真正要小心的是混用场景:比如同时写了 <body onload="start()"> 又在模块里用 addEventListener,前者很可能被后者无意覆盖,而你根本不会在控制台看到任何警告。把初始化逻辑统一收口到一个事件监听器里,比分散在 HTML 属性和多处 JS 中更可控。


















