《JavaScript 闯关记》之初探
当学习一门新的编程语言的时候,应该边学边做,反复演练以加深理解。因此,你需要一个 JavaScript 解释器。幸运的是,每一个 Web 浏览器都包含一个 JavaScript 解释器。
可以通过在 HTML 文件里写一个 <script>
元素来嵌入 JavaScript 代码,当浏览器加载 HTML 文件的时候,它会自动执行这段代码。如果运行的是一小段 JavaScript 代码,则不必每次都这样做。我们可以利用 Chrome 浏览器的「开发者工具」来运行这些小段代码,通常按 F12
或者 Ctrl+Shift+J
快捷键可以唤醒控制台。
现代浏览器可以使用函数
console.log()
来向控制台输出消息,通过这种方式可以非常方便地调试代码。
<script>
元素
使用 <script>
元素的方式有两种:
- 直接在页面中嵌入 JavaScript 代码。
- 包含外部 JavaScript 文件。
使用 <script>
元素嵌入 JavaScript 代码时,只需为 <script>
指定 type
属性。然后,像下面这样把 JavaScript 代码直接放在元素内部即可:
<script type="text/javascript">
function sayHello(){
console.log("Hello!");
}
</script>
在 HTML5 规范中,
<script>
的type
属性默认是"text/javascript"
,所以可以省略;但是在 HTML 4.01 和 XHTML 1.0 规范中,type
属性是必须的。可以参考 Stack Overflow 上的回答:http://stackoverflow.com/questions/4243577/which-is-better-script-type-text-javascript-script-or-script-scr
如果要通过 <script>
元素来包含外部 JavaScript 文件,那么 src 属性就是必需的。这个属性的值是一个指向外部 JavaScript 文件的链接,例如:
<script type="text/javascript" src="example.js"></script>
包含在 <script>
元素内部的 JavaScript 代码将被从上至下依次解释,在解释器对 <script>
元素内部的所有代码求值完毕之前,页面中的其余内容都不会被浏览器加载或显示。
需要注意的是,带有 src
属性的 <script>
元素不应该在其 <script>
和 </script>
元素之间再包含额外的 JavaScript 代码。如果包含了嵌入的代码,则只会下载并执行外部脚本文件,嵌入的代码会被忽略。
<script type="text/javascript" src="example.js">
console.log("Hello!"); //永远不会执行
</script>
另外,通过 <script>
元素的 src
属性还可以包含来自外部域的 JavaScript 文件。例如:
<script type="text/javascript" src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
在 HTML 中嵌入 JavaScript 代码虽然没有问题,但一般认为最好的做法还是尽可能使用外部文件来包含 JavaScript 代码。
元素的位置
按照惯例,所有的 <script>
元素都应该放在页面的 <head>
元素中,例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript" src="example1.js"></script>
<script type="text/javascript" src="example2.js"></script>
</head>
<body>
<!-- 这里放内容 -->
</body>
</html>
可是这种做法意味着必须等到全部 JavaScript 代码都被下载、解析和执行完成之后,才能开始呈现页面的内容(浏览器在遇到 <body>
元素时才开始呈现内容)。对于那些需要加载很多 JavaScript 代码的页面来说,会导致页面出现明显的延迟(浏览器窗口一片空白)。为了避免这个问题,最好的做法是把 <script>
元素放到 HTML 文档的最后面,</body>
元素之前,例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<!-- 这里放内容 -->
<script type="text/javascript" src="example1.js"></script>
<script type="text/javascript" src="example2.js"></script>
</body>
</html>
小结
把 JavaScript 插入到 HTML 页面中要使用 <script>
元素。使用这个元素可以把 JavaScript 嵌入到 HTML 页面中,让脚本和标记混合在一起;也可以包含外部的 JavaScript 文件。
在包含外部 JavaScript 文件时,必须将 src
属性设置为指向相应文件的 URL。而这个文件既可以是本服务器上的文件,也可以是其他任何域中的文件。
所有 <script>
元素都会按照他们在页面中出现的先后顺序依次被解析。
关卡
现有一个网页(代码如下),引用了大量的外部 JavaScript 文件,打开该网页会一直显示空白,直至外部 JavaScript 文件全部下载完毕,才能正常显示网页内容「本页面用来测试 <script>
加载顺序~」,用户体验不好。请尝试修改页面中 <script>
元素的位置,实现以下效果:
- 挑战一:实现打开页面就能看到网页内容「本页面用来测试
<script>
加载顺序~」,不必等外部 JavaScript 文件全部下载完毕才显示。 - 挑战二:实现在外部 JavaScript 文件下载之前「开启页面加载效果」,外部 JavaScript 文件全部下载完毕之后「关闭页面加载效果」。
最终效果可参考 http://shijiajie.com/other/javascript-lesson/1.2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>javascript-lesson-1.2</title>
<link rel="stylesheet" href="http://qiniu.shijiajie.com/blog/javascript-lesson/1.2/layer.css">
<!-- 开启页面加载效果 -->
<script src="http://qiniu.shijiajie.com/blog/javascript-lesson/1.2/layer.js"></script>
<script>layer.open({ type: 2, shadeClose: false });</script>
<!-- 关闭页面加载效果 -->
<script>setTimeout(function(){ layer.closeAll(); },500);</script>
<!-- 引入 10MB 外部 JavaScript,比较耗时 -->
<script src="http://qiniu.shijiajie.com/blog/javascript-lesson/1.2/external.js"></script>
</head>
<body>
本页面用来测试 <script> 加载顺序~
</body>
</html>
更多
关注微信公众号「劼哥舍」回复「答案」,获取关卡详解。
关注 https://github.com/stone0090/javascript-lessons,获取最新动态。
《JavaScript 闯关记》之初探的更多相关文章
- 《JavaScript 闯关记》
为何写作此课程 stone 主要负责基于 Web 的企业内部管理系统的开发,虽然能够熟练地使用 JavaScript,但随着对 JavaScript 的理解越来越深,才发现自己尚未掌握其精髓. 201 ...
- 《JavaScript闯关记》视频版硬广
<JavaScript闯关记>视频版硬广 stone 在菜航工作时,兼任内部培训讲师,主要负责 JavaScript 基础培训,2016年整理的<JavaScript闯关记>课 ...
- JavaScript 闯关记
DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API.DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 节点层次 DOM 可以将任何 HTML 或 XM ...
- 《JavaScript 闯关记》之垃圾回收和内存管理
JavaScript 具有自动垃圾收集机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存.而在 C 和 C++ 之类的语言中,开发人员的一项基本 ...
- 《JavaScript 闯关记》之原型及原型链
原型链是一种机制,指的是 JavaScript 每个对象都有一个内置的 __proto__ 属性指向创建它的构造函数的 prototype(原型)属性.原型链的作用是为了实现对象的继承,要理解原型链, ...
- 《JavaScript 闯关记》之作用域和闭包
作用域和闭包是 JavaScript 最重要的概念之一,想要进一步学习 JavaScript,就必须理解 JavaScript 作用域和闭包的工作原理. 作用域 任何程序设计语言都有作用域的概念,简单 ...
- 《JavaScript 闯关记》之事件
JavaScript 程序采用了异步事件驱动编程模型.在这种程序设计风格下,当文档.浏览器.元素或与之相关的对象发生某些有趣的事情时,Web 浏览器就会产生事件(event).例如,当 Web 浏览器 ...
- 《JavaScript 闯关记》之 DOM(下)
Element 类型 除了 Document 类型之外,Element 类型就要算是 Web 编程中最常用的类型了.Element 类型用于表现 XML 或 HTML 元素,提供了对元素标签名.子节点 ...
- 《JavaScript 闯关记》之 DOM(上)
DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API.DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 节点层次 DOM 可以将任何 HTML 或 XM ...
随机推荐
- 第八届郑州轻工业学院ACM(程序设计大赛)校内预选赛
郑州轻工业学院有一个大赛,把几个有趣的题目分享一下.下面是题目连接,喜欢了就点点... 斗破苍穹 礼上往来 统计人数 神の数 炉石传说 Mathematics and Geometry 马拉松后记 斗 ...
- IOS Custom NavigationItem --写titleView
//先自己写一个titleView UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 20)];//all ...
- 【欧拉函数】【HDU1286】 找新朋友
找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- ECSHOP首页站内快讯在哪里添加和修改?
“添加新闻后在首页站内快讯处显示不出来?”.“请问首页中站内快讯(最新文章)在后台哪个位置管理”.“如何让发布的文章进入首页站内快讯”等等诸如此类的问题,经常在论坛里看到一些朋友在询问. 本ECSHO ...
- C# LiNq的语法以及常用的扩展方法
首先先来扯一下,这篇博文是我第一次写的,主要是我的一些摘录,希望对大家有所帮助. Linq的基础 •LINQ(读音link):Linq To SQL(过时).Linq To Object.Linq T ...
- C#整理8——结构体
结构体:相当于是我们自己定义的一种复杂的类型.int... double float bool char string DateTime 数组类型生活中大部份的对象都是复合型的对象. 如何定义结构体类 ...
- locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
安装好CentOS后,第一次进入系统使用locate命令,结果出现:locate: can not stat () `/var/lib/mlocate/mlocate.db': No such fil ...
- 查询sybase DB中占用空间最多的前20张表
按照数据行数查询 name, row_count(db_id(), id) from sysobjects order by row_count(db_id(),id) desc 按照分配的空间查询 ...
- WindowsForm 打印
打印: 打印对话框:printdialog 页面设置:pagesetupdialog 这两个对话框都需要通过设置printdocument来指定打印对象 printdocument:打印对象,必须要有 ...
- codeforces 713D D. Animals and Puzzle 二分+二维rmq
题目链接 给一个01矩阵, 然后每个询问给出两个坐标(x1, y1), (x2, y2). 问你这个范围内的最大全1正方形的边长是多少. 我们dp算出以i, j为右下角的正方形边长最大值. 然后用二维 ...