JavaScript 中的 window onload 应该什么时候写

1. 页内式 JS 代码

1.1 页内式 JS 代码写在 head 内部
如果 script 标签写在 head 标签内部,则位于 body 内的元素将晚于 JS 代码加载,那么其中一些获取 DOM 元素的方法将无法取得元素(返回 null)。
以下示例代码的意图是把“我要红红火火恍恍惚惚!”这一段文字变成红色,可见并没有起作用,控制台也会报错。

示例代码:test1.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>写在页内且位于head中的JS代码</title><script>document.getElementById("text").style.color = "red";</script>
</head>
<body><p id="text">我要红红火火恍恍惚惚!</p>
</body>
</html>

效果及报错信息

修改代码,加上 window.onload。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>页内式JS代码写在head内部</title><script>window.onload = function () {document.getElementById("text").style.color = "red";};</script>
</head>
<body><p id="text">我要红红火火恍恍惚惚!</p>
</body>
</html>

最终显示效果

1.2 页内式 JS 代码写在 body 结束之前
页内式 JS 代码写在 前面,则其它元素会早于 JS 代码加载,所以不用写 window.onload,当然加上也不影响什么。

示例代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>页内式JS代码写在body结束标签之前</title>
</head>
<body><p id="text">我要红红火火恍恍惚惚!</p><script>document.getElementById("text").style.color = "red";</script>
</body>
</html>

显示效果

1.3 结论
对于页内式 JS 代码:

如果 script 标签写在 head 标签内部,必须写 window.onload;
如果 script 标签写在 标签前面,不用写 window.onload。

2. 外链式 JS 代码

结论:外链式 JS 代码,不管 script 标签写在哪里,都需要写 window.onload。

如果 script 标签写在了 head 标签内部,那么该 JS 代码会在 HTML 文档之前加载到浏览器。
如果 script 标签写在了 前面,同样无法保证哪个文件最先结束加载,因为浏览器可能一次加载多个文件。
关于“一次加载多个文件”的个人理解:同时下载 html 文件和外链的 js 文件,并不能确定谁先下载完成。

因为脚本加载时文档可能不完整,所以模型也不完整。没有完整的 DOM,getElementsByTagName 等方法就不能正常工作。

3. 杂谈

window.onload 为什么管用?

文档对象 document 会被加载到一个浏览器窗口对象 window 里,文档对象 document 作为窗口对象 window 的一个属性存在。当窗口对象 window 触发加载完毕事件(onload)时,window.document 属性已经可以正常访问并使用。
所以在 window.onload 指派的回调函数里面,文档对象 document 是完整的,于是在里面编写的 JavaScript 代码能够访问到完整的 DOM 树。
能不能把 script 标签写在 标签之后?

最好不要把 script 标签写在 标签之后,这从 HTML 2.0 开始就是不合标准的。
按照 HTML5 标准,如果在 后再出现

JavaScript 中的 window onload 应该什么时候写相关推荐

  1. javascript中的window.onload解释

    window.onload 我们都知道的是我们的前端页面都是从上向下加载,也就是说我们的javascript文件如果放在文本页面文件的上方,我们就会先加载javascript中的文件,而此时带来的问题 ...

  2. js中的window.onload和jquery中的load区别的讲解

    JavaScript 中的以下代码 [javascript] view plaincopyprint? Window.onload = function (){      // 编写代码 } Wind ...

  3. JavaScript中的window.close在FireFox和Chrome上不能正常动作的解决方法

    原文:JavaScript中的window.close在FireFox和Chrome上不能正常动作的解决方法 JS中关闭窗口的方法window.close()在IE上能够正常动作,而在FireFox和 ...

  4. JavaScript中的Window窗口对象【转载】

    本文转载自:http://www.ijavascript.cn/jiaocheng/javascript-window-65.html 他是JavaScript中最大的对象,它描述的是一个浏览器窗口. ...

  5. javascript中ready和onload的理解

    首先,document.ready和window.onload都是原生js的,但是js并没有实现ready方法,需要自己实现,或者使用jQuery的文档就绪方法:而onload在没定义方法之前,也只是 ...

  6. javascript 中的window, document, screen都有什么区别?

    谷歌之后,从stackoverflow上找到的高赞答案: https://stackoverflow.com/questions/9895202/what-is-the-difference-betw ...

  7. JavaScript中的window对象详解

    1.window对象简介 (1)在JavaScript中,一个浏览器窗口就是一个window对象. (2)一个窗口就是一个window对象,这个窗口里面的HTML文档就是一个document对象,do ...

  8. parent.window php,javascript中的window.self、window.top、window.parent和window.opener详解

    在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法 ...

  9. java window.onload_从HTML中的window.onload调用webpacked代码

    我在index.js中有一个导出的模块,带有一个函数start(),我希望在我的HTML的body标签中调用 以下是来自项目的代码:https://github.com/zv/tree require ...

最新文章

  1. 数据中心ECC值班长岗位提升工作总结
  2. DL之LSTM:基于《wonderland爱丽丝梦游仙境记》小说数据集利用LSTM算法(层加深,基于keras)对单个character字符预测
  3. Attachments failing with invalid id (Bugtraker.net)
  4. 修改httpd默认端口号
  5. jquery项目中一些常用方法
  6. 使用 CodeIgniter 框架快速开发 PHP 应用(四)
  7. f2fs解析(四)f2fs的extent特性
  8. 一文详解3D相机面临的困难问题和解决方案
  9. unity3d技术摄像头跟随_天尚元无人驾驶技术应用丨环卫清扫车
  10. GULP案例1:计算声子色散曲线和态密度
  11. kali安装百度网盘客户端
  12. html飞机大战游戏实验报告,JavaScript原生编写《飞机大战坦克》游戏完整实例
  13. Java 实习生(月薪 3k-5k 水平)应具备哪些知识、能力?给学弟学妹们支招
  14. python续行_python的续行
  15. 机器学习习题(17)
  16. 项目中生成requests.txt文件(virtualenv与pipreqs)
  17. Pygame学习笔记 4 —— 时间与运动
  18. 携程手机端网页设计效果图
  19. 使用openssl生成crt证书
  20. Zabbix监控之监控项

热门文章

  1. c语言atoll函数怎么用_C ++中带有示例的atoll()函数
  2. c ++查找字符串_C ++结构| 查找输出程序| 套装2
  3. 两顶点的路径长度为k_计算两个顶点之间的所有可能路径
  4. 小写大写转换_小写到大写转换器JavaScript工具| 网络应用项目
  5. Java LinkedHashMap forEach()方法与示例
  6. 2017年AR大会上海站干货分享
  7. Mysql5.0没有nvarchar,national
  8. servlet 和 struts2 同时使用 以及 使用struts2标签库时报错
  9. ORA-00911:无效字符 错误及解决
  10. Kubernetes 部署 Ingress 控制器 Traefik v1.7.4