You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让HTML完全加载后再执行外部JavaScript文件?

解决HTML加载完成后再执行JavaScript的问题

嘿,我懂你现在的烦恼——页面还没显示出任何内容,那个prompt对话框就弹出来了,用户根本看不到ToDo列表的操作说明对吧?别担心,有几个简单可靠的方法能完美解决这个问题:

方法1:用DOMContentLoaded事件(最推荐)

这是浏览器提供的标准事件,专门用来监听DOM完全解析完成的时刻。你只需要把所有JS逻辑包裹在这个事件监听里就行,修改你的todo.js代码如下:

document.addEventListener('DOMContentLoaded', function() {
  // 原来的所有代码都放这里面
  var todos = ["Eat dinner"];
  var input = prompt("What would you like to do?");
  while(input !== "quit") {
    if(input === "list") {
      console.log(todos);
    } else if(input === "new") {
      var newTodo = prompt("Enter a new ToDo item");
      todos.push(newTodo);
    }
    input = prompt("What would you like to do?");
  }
  console.log("Ok, you quit the app! :/");
});

这样一来,只有当页面的所有HTML都被解析成DOM树,浏览器准备好展示内容之后,才会触发这段代码弹出对话框,用户就能先看到ToDo的操作指引啦。

方法2:给script标签加defer属性

如果不想改动JS代码,也可以直接在HTML里的script标签上加上defer属性:

<script src="assets/js/todo.js" type="text/javascript" defer></script>

defer的作用是让浏览器继续解析HTML的同时异步加载JS文件,等整个HTML页面解析完成后,再执行这个JS文件。这样也能保证HTML先显示,再弹出对话框。

方法3:确认script标签的位置(基础优化)

其实你已经把script标签放在</body>之前了,这本身是个好习惯——因为浏览器是按顺序解析HTML的,遇到script标签会先加载执行JS,再继续解析后面的内容。不过有时候如果JS文件很小或者加载速度极快,可能在浏览器渲染页面之前就执行了,所以前面两种方法会更稳妥。

小补充:defer vs async

别搞混这两个属性哦:

  • async是JS文件加载完成后立刻执行,不管HTML有没有解析完,所以可能还是会出现提前弹出对话框的情况;
  • defer是严格等HTML解析完成后再执行JS,而且会按照script标签的顺序执行,完全符合我们的需求。

内容的提问来源于stack exchange,提问作者Dennis Lundberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:41:28