![Python高效开发实战:Django、Tornado、Flask、Twisted(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/109/40795109/b_40795109.jpg)
3.3 JavaScript
JavaScript是一种直译式脚本语言,是一种动态类型语言,内置支持类型。它的解释器被称为JavaScript引擎,该引擎内置于现代的所有浏览器中。在HTML网页上使用JavaScript可以为HTML网页增加动态功能。
3.3.1 在HTML中嵌入JavaScript
作为一种所有浏览器都支持的解释性脚本语言,在HTML中应用JavaScript一般有如下目的。
• 在客户端读写HTML元素,实现切换文字、滚动条等动态效果。
• 响应浏览器事件,如窗口变大、变小等。
• 验证表单输入,常见于密码的两次输入是否相同、出生年月是否小于当前时间等。
在HTML中嵌入JavaScript有两种方式:内部嵌入和外部链接。内部嵌入是指直接在HTML中用<script>标签写入脚本;外部链接是指在HTML中通过文件名引用独立的脚本文件。
【示例3-9】在HTML中嵌入JavaScript的示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/128-1.jpg?sign=1739530820-NuRE0NcAObcSweW4JsurF67gKREtvGKJ-0-c4f876d00cba63063fde0bf760ed036c)
技巧:外部JavaScript文件通常以*.js命名,这样有利于各种编辑器进行智能解析。
本例中在页面上定义了一个按钮,当用户单击它时界面显示“Hello world of JavaScript”。内部脚本可以写在HTML文件中的任何地方,可以写在<head>标签中,也可以写在<body>标签中。
3.3.2 JavaScript的基本语法
我们在3.3.1节中已经完成了JavaScript的“Hello World”的学习,可以体会到JavaScript的语法与Java很像,但其动态类型的特点与Python也有类似之处。本节对JavaScript的基本语法进行讲解。
1. 语句
JavaScript区分大小写,每条语句以分号“;”结尾,用大括号“{ }”表示作用域(而不是Python中的缩进),所以每条语句和变量之间可以有任意空格、Tab符或回车符。JavaScript用C、C++风格的“/* … */”表示注释。比如:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/129-1.jpg?sign=1739530820-NwsynOpvZVZsMQr76DKfw523I81pULzU-0-a96498112261291e08fdc33805251ef6)
2. 变量及数据类型
JavaScript是动态数据类型,即一个变量的类型随着其值的变化而变化。变量用“var”关键字声明,变量名可以由字母、数字、下画线等组成。常用的数据类型有字符串、数字、布尔、数组、对象等,字符串用双引号表示。变量及数据类型的举例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/129-2.jpg?sign=1739530820-aZbokynQUEqslhd7rbSO3bjcFsWL6nEX-0-466311fcc614f849b6ff0a3412274b3d)
关键字new是JavaScript中用于新建组件实例的关键字,定义数组时需用new建立一个Array对象,并在其参数中给出数组元素(如本例中的变量xx);也可以在定义数组时不给初始值,而在之后通过下标赋值(如本例中的变量arr)。JavaScript中的数组下标从0开始。
JavaScript中的对象类型与Python中的Dictionary类型相似,都是用大括号以键值对的方式表示,但其语法略有不同。在Python中Dictionary的“键”是任意数据类型,示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/130-1.jpg?sign=1739530820-fZlCY8h7RY26qMR6Z8a99WW5jGHwNXZB-0-a10ca1958781fb5f8dcac99768769a74)
在JavaScript的对象中,“键”只能以成员变量的方式出现,定义时键上不加双引号,示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/130-2.jpg?sign=1739530820-gX4EtdzRR84twjDJLJOkhuYHcldZ5aGU-0-0cfbebb127bfbeaa982521517cf8c0ed)
3. 操作符
常用操作符与Python类似,有+、-、*、/、%、==、>=、<=等。此外,JavaScript还允许自增操作(++)、自减操作(--)。操作符的示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/130-3.jpg?sign=1739530820-JYNV80udg9jCcuNmkWQ06VOw8FzTaV3s-0-15d111bd5f07917f48d4b3e8089d8efb)
4. 函数
JavaScript中用关键字function定义函数,语法如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/131-1.jpg?sign=1739530820-VYRCMrVj67OEqICPrsCpCavbkuyierpl-0-6d4183a966af060ee60789a0db73c0db)
和Python一样,JavaScript函数中的返回值是可选的,如果函数有返回值,则可以在block_of_function中用return语句返回,示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/131-2.jpg?sign=1739530820-lvwodtX3o5h39fYDR2JV4ZNv78c1EA5t-0-e0ac8c304fdcaa31359a3b60a7d36386)
5. 判断语句
JavaScript中有两种判断语句:if和switch。if语句用于对不同的条件执行不同的代码块;switch语句用于对一个表达式的不同结果执行不同的代码块。判断语句的语法如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/131-3.jpg?sign=1739530820-vTgRP9Ona3gwaD4tuvbEPRV8fYKeGtQv-0-51ef41d447eaaf2598efb13a3e4c2435)
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/132-1.jpg?sign=1739530820-Nui78zljPZLI1njKWfpwXLiBr0LI4LdO-0-12a35f3af1e382e643846d4e26d09209)
if语句的语义与Python中相似,此处不再举例。switch语句举例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/132-2.jpg?sign=1739530820-qkHBN0pIYudOWy1fEowlvRUY6fIBS7mh-0-31bb34d140e0be0b57fc16af119295a5)
每个条件的block中可以放多条语句,但是每个块中都应该以break语句结尾。
注意:switch语句的每个块中都应该以break作为最后一条语句。
6. 循环语句
JavaScript的循环语句有for和while两种,各有两种用法。for的第1种语法如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/133-1.jpg?sign=1739530820-yTDBs6uTKiE0e30fkRg6g3cPrpEBlfzS-0-77c8da1fd9da6848f39fa6ed03ce99af)
其中sentence1在for语句开始时执行且只执行一次;sentence2在每个loop开始时执行,sentence2应该返回一个布尔值,如果sentence2的结果为true,则执行该loop,否则立即结束for循环;sentence3在每次循环结束时执行。for语句的典型用法如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/133-2.jpg?sign=1739530820-he2DbM1EcTdMm21jYeFpCs9icl1jNKXz-0-3eb4800d54441c29227409fa35ec23cd)
本例中的循环体将执行10次,即在document中写入10个<br>标签。
for的第2种用法和while语句及Python中的for语句用法相似,此处只列出其语法规则,读者可以自行编写代码练习。
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/133-3.jpg?sign=1739530820-BXy6RBWpHVbMxe7Ksv0d65eUrOcZvSQp-0-772be3da2299fe0188aa6534f3541b62)
3.3.3 DOM及其读写
DOM(Document Object Model)是当网页被加载时浏览器创建的页面文档对象模型。DOM用结构化的方式描述了标记语言的文件内容。JavaScript中几乎所有有意义的行为都是围绕DOM展开的,如读写页面元素、响应页面事件、进行表单验证等。本节介绍DOM的基本语义及使用DOM实现HTML页面元素的读写。
HTML DOM被构建为树结构,在DOM内部每个HTML页面被描述为一个以document为根节点的树,HTML中的每一个标签<..>都被表示为该树中的一个节点,例如下面的HTML文件:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/134-1.jpg?sign=1739530820-gPqMNX4wh6oyYT01uVitsNIVSFIaODX4-0-72042c1674e59f9819772d29a5924a3d)
浏览器加载时生成的DOM树如图3.12所示。
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/134-2.jpg?sign=1739530820-DkF2sUFN5MVHesXPAxYlJqdnwl9g7kPY-0-4d1e444a744c2a3a5e94ae00d96430a1)
图3.12 DOM树示例
通过操作DOM树,JavaScript可以读、增、删、改HTML标签的元素、内容、属性、样式等。DOM提供了一系列支持JavaScript遍历和修改DOM的方法,下面逐个举例。
1. 查找节点
一般情况下在DOM中查找节点时无须遍历树结构,而通过document对象的如下3个函数直接实现。
• getElementById( id ):返回对拥有指定id的第1个对象的引用。
• getElementsByName( name ):返回带有指定名称的对象集合。
• getElementsByTagName( tagName ):返回带有指定标签名的对象集合。
例如,对于图3.12中的DOM树可以编写如下脚本:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/135-1.jpg?sign=1739530820-yOCo32hW0XzEJsJZxnnwaCkIzqvxloL5-0-640c59e80a8c799829de69cb72473f0e)
找到一个节点后,可以根据其相对位置的属性查找其周围的节点,这些相对位置查找的常用属性如表3.6所示。
表3.6 DOM相对位置查找的常用属性
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/135-2.jpg?sign=1739530820-de5bpdmShm44QqRW2Z5pDJ4FNSVgvRto-0-d070e622646748cae0ae53a03b82b224)
注意:本节中的obj.xxxx表示该函数或属性是通过节点进行调用或访问的。
节点的相对位置属性举例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/135-3.jpg?sign=1739530820-B4neWBhcnvx6aLkMZji05XhLosjAAt9b-0-eb4497c7d452012935fc66ae4755ee20)
2. 增加节点
查找到一个节点后可以在其中插入子节点,新增节点通过document.createElement()和obj.appendChild()/obj.insertBefore()/obj.replaceChild()等实现,仍然以图3.12为例:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/136-1.jpg?sign=1739530820-8nxh14PAa9NaLCpq3SGS93ePiKHTr6xo-0-0a84cb20b25dab5db0aa0deac1298fab)
3. 删除节点
删除节点通过obj.removeChild()方法实现,针对图3.12中的DOM举例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/136-2.jpg?sign=1739530820-K981E5LiL9jndGBAKFOllfx0liUBsISb-0-026a49414eca50328de0c186cd76697c)
4. 访问及修改属性节点
属性节点是指HTML标签中的属性,以键和值的方式呈现,例如,<div id="container">中的id = "container"就是<div>标签节点的一个属性节点。通过设置属性节点,可以控制一个HTML标签的id、name、CSS等。属性节点的读取与设置通过obj.getAttribute()和obj.setAttribute()函数完成。同时,JavaScript允许以成员变量的方式访问属性节点,举例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/136-3.jpg?sign=1739530820-BEVlgLjSIn0WrACb3LM50LYa6O1mvu65-0-2399bbc14df3d2757e2851f69a498596)
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/137-1.jpg?sign=1739530820-YhPEU8QDqtQrA77b7KIVOpwmtAL682wr-0-63ea282f39ad982ce60d3dd4ed741619)
5. 访问及修改节点的内容
大多数节点都有内容,例如,本例中的两个<p>节点都有文本内容,而两个<p>节点本身又是<div>的内容。DOM中通过obj.innerHTML访问和修改节点内容,示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/137-2.jpg?sign=1739530820-G35pBzRdqGMl0iXBgvPo8zjlFDuHS6DW-0-ae8a75c32f72ab002902ca26abb890c1)
3.3.4 window对象
在JavaScript编程中,除了用DOM模型访问HTML页面中的内容,有时还需要访问和操作除HTML本身外的一些信息,如浏览器的窗口大小、网址等,这些信息通过window对象和其子对象document(文档)、history(浏览历史)、location(URL相关)、navigator(浏览器)的一些固有属性和方法进行访问。常用的window对象的属性或方法如表3.7所示。
表3.7 常用的window对象的属性或方法
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/137-3.jpg?sign=1739530820-Mf65z8AMSNovm92l1n88mhzAmMbwF15v-0-2fe2ce04097bfad2642369b18ec61536)
续表
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/138-1.jpg?sign=1739530820-PFzxnf8Y9KZ2zbyjDDyJXw1FVKtNqrye-0-80a03522cb5b88ef63c7b798d9b1e64f)
表3.8、表3.9、表3.10、表3.11、表3.12分别列出了浏览器window子对象document、history、location、navigator、screen(显示屏)的常用属性或方法。
表3.8 document的常用属性
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/138-2.jpg?sign=1739530820-KLgp90j21gklM0IfZIiDLqJ28s1lJity-0-9761c38efbdaad835e788f0eca31c1c7)
表3.9 history的常用属性或方法
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/139-1.jpg?sign=1739530820-9sUEv231fGvY20fOq3pQdJWIlcfZApMM-0-e88b37e0a8555369bcd984dbb62418ff)
表3.10 location对象的常用属性或方法
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/139-2.jpg?sign=1739530820-tzmHSuPvIUkEqnS2ACYAZSlZ92BZVqwm-0-badd28e6c1a8471ceb3e9a2d836767e0)
表3.11 navigator对象常用属性或方法
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/139-3.jpg?sign=1739530820-d7TRtqIJ4410ylJ3Cay7TvPf8WziXVtt-0-7843e5796fe429d2f4413d28349ba73c)
表3.12 screen对象的常用属性
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/140-1.jpg?sign=1739530820-qOeOvrJYu2R6gB6wAJWoDfAzeVrjyXk1-0-87d4c22029541d24496e4341b9ec5993)
【示例3-10】对以上属性或方法都可以直接通过window对象调用,举例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/140-2.jpg?sign=1739530820-9RBpFCBBoce9u376sB04Nx3jEItZauvp-0-3894112c94b936dcdb306425b825a5a3)
3.3.5 HTML事件处理
用户在使用浏览器的过程中通常会产生一些事件,如移动鼠标、窗口大小发生变化、播放音频结束等。JavaScript可以响应这些事件所执行的代码,这称为HTML事件处理。事件响应是通过给HTML标签设置事件属性来完成的,语法如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/140-3.jpg?sign=1739530820-8zjSKreiPHfuCTt3FUZD39k0IBvR0ipU-0-61ecdf9d7e9238e2d0a06852130a2846)
比如,如下代码在页面完全加载(onload事件)后显示一个提示框:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/140-4.jpg?sign=1739530820-lElGSZ26EdtQxvDSHlkfVxQFa8I7Ex0O-0-f6626b99b555313fb3085f97f2791910)
【示例3-11】如果需要运行的代码比较多,则可以将这些代码封装到一个函数中,示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/141-1.jpg?sign=1739530820-SgjyaRf0rILXPvf5LDcd2hOWzPxi0L4B-0-807b8d65f932ad84fc523567a61b7d62)
HTML中有很多这样的事件可以定义,每个事件可以应用的标签不尽相同,常用的事件总结如表3.13所示。
表3.13 常用的HTML事件总结
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/141-2.jpg?sign=1739530820-Ibq623bC2rjlVlDGBxeyaqnsmsik4LNw-0-c4048edf6b8ef5aee29287de44ad0de0)
续表
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/142-1.jpg?sign=1739530820-GLMv3aisTalmuvgwzDUnHGsatIU369zP-0-be9461e70d21600196fc03e86a35ea5d)