#### 第3章:
#### JavaScript
##### JavaScript 能够改变 HTML 内容
![](https://www.runoob.com/images/pic_htmltree.gif)
通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。
* JavaScript 能够改变页面中的所有 HTML 元素
* JavaScript 能够改变页面中的所有 HTML 属性
* JavaScript 能够改变页面中的所有 CSS 样式
* JavaScript 能够对页面中的所有事件做出反应
HTML DOM 元素对象
在 HTML DOM (Document Object Model) 中, 每个元素(或者非元素)都是节点 :
* 文档本身就是一个文档对象
* 所有 HTML 元素都是元素节点
* 所有 HTML 属性都是属性节点
* 插入到 HTML 元素文本是文本节点
* 注释是注释节点
#### 3.1 Document 节点对象
HTML文档使用以下属性和方法:
| 属性 / 方法 | 描述 |
| --- | --- |
| document.activeElement | 返回当前获取焦点元素 |
| document.addEventListener() | 向文档添加句柄 |
| document.adoptNode(node) | 从另外一个文档返回 adapded 节点到当前文档。 |
| document.anchors | 返回对文档中所有 Anchor 对象的引用。 |
| document.applets | 返回对文档中所有 Applet 对象的引用。**注意:** HTML5 已不支持 元素。 |
| document.baseURI | 返回文档的绝对基础 URI |
| document.body | 返回文档的body元素 |
| document.close() | 关闭用 document.open() 方法打开的输出流,并显示选定的数据。 |
| document.cookie | 设置或返回与当前文档有关的所有 cookie。 |
| document.createAttribute() | 创建一个属性节点 |
| document.createComment() | createComment() 方法可创建注释节点。 |
| document.createDocumentFragment() | 创建空的 DocumentFragment 对象,并返回此对象。 |
| document.createElement() | 创建元素节点。 |
| document.createTextNode() | 创建文本节点。 |
| document.doctype | 返回与文档相关的文档类型声明 (DTD)。 |
| document.documentElement | 返回文档的根节点 |
| document.documentMode | 返回用于通过浏览器渲染文档的模式 |
| document.documentURI | 设置或返回文档的位置 |
| document.domain | 返回当前文档的域名。 |
| document.domConfig | **已废弃**。返回 normalizeDocument() 被调用时所使用的配置。 |
| document.embeds | 返回文档中所有嵌入的内容(embed)集合 |
| document.forms | 返回对文档中所有 Form 对象引用。 |
| document.getElementsByClassName() | 返回文档中所有指定类名的元素集合,作为 NodeList 对象。 |
| document.getElementById() | 返回对拥有指定 id 的第一个对象的引用。 |
| document.getElementsByName() | 返回带有指定名称的对象集合。 |
| document.getElementsByTagName() | 返回带有指定标签名的对象集合。 |
| document.images | 返回对文档中所有 Image 对象引用。 |
| document.implementation | 返回处理该文档的 DOMImplementation 对象。 |
| document.importNode() | 把一个节点从另一个文档复制到该文档以便应用。 |
| document.inputEncoding | 返回用于文档的编码方式(在解析时)。 |
| document.lastModified | 返回文档被最后修改的日期和时间。 |
| document.links | 返回对文档中所有 Area 和 Link 对象引用。 |
| document.normalize() | 删除空文本节点,并连接相邻节点 |
| document.normalizeDocument() | 删除空文本节点,并连接相邻节点的 |
| document.open() | 打开一个流,以收集来自任何 document.write() 或 document.writeln() 方法的输出。 |
| document.querySelector() | 返回文档中匹配指定的CSS选择器的第一元素 |
| document.querySelectorAll() | document.querySelectorAll() 是 HTML5中引入的新方法,返回文档中匹配的CSS选择器的所有元素节点列表 |
| document.readyState | 返回文档状态 (载入中……) |
| document.referrer | 返回载入当前文档的文档的 URL。 |
| document.removeEventListener() | 移除文档中的事件句柄(由 addEventListener() 方法添加) |
| document.renameNode() | 重命名元素或者属性节点。 |
| document.scripts | 返回页面中所有脚本的集合。 |
| document.strictErrorChecking | 设置或返回是否强制进行错误检查。 |
| document.title | 返回当前文档的标题。 |
| document.URL | 返回文档完整的URL |
| document.write() | 向文档写 HTML 表达式 或 JavaScript 代码。 |
| document.writeln() | 等同于 write() 方法,不同的是在每个表达式之后写一个换行符。 |
**HTML文档对象可以避免使用这些节点对象和属性:**
| 属性 / 方法 | 避免的原因 |
| --- | --- |
| document.attributes | 文档没有该属性 |
| document.hasAttributes() | 文档没有该属性 |
| document.nextSibling | 文档没有下一节点 |
| document.nodeName | 这个通常是 #document |
| document.nodeType | 这个通常是 9(DOCUMENT\_NODE) |
| document.nodeValue | 文档没有一个节点值 |
| document.ownerDocument | 文档没有主文档 |
| document.ownerElement | 文档没有自己的节点 |
| document.parentNode | 文档没有父节点 |
| document.previousSibling | 文档没有兄弟节点 |
| document.textContent | 文档没有文本节点 |
##### 获取DOM 元素节点的方法
getElementById 返回指定id的DOM元素节点对象
getElementsByClassName 返回指定class的DOM元素节点对象
getElementsByName 返回指定name的DOM元素节点对象
getElementsByTagName 返回指定元素名称的DOM元素节点对象
getElementsByTagNameNS
~~~
<html>
<head>
<script type="text/javascript">
function getValue()
{
var x=document.getElementById("myHeader")
alert(x.innerHTML)
}
</script>
</head>
<body>
<h1 id="myHeader" onclick="getValue()">这是提示的文本</h1>
<p>上面绑定的点击事件</p>
</body>
</html>
~~~
##### DOM对象的属性和方法
以下属性和方法可适用于所有 HTML 元素:
| 属性 / 方法 | 描述 |
| --- | --- |
| *element*.accessKey | 设置或返回accesskey一个元素 |
| *element*.addEventListener() | 向指定元素添加事件句柄 |
| *element*.appendChild() | 为元素添加一个新的子元素 |
| *element*.attributes | 返回一个元素的属性数组 |
| *element*.childNodes | 返回元素的一个子节点的数组 |
| *element*.children | 返回元素的子元素的集合 |
| *element*.classList | 返回元素的类名,作为 DOMTokenList 对象。 |
| *element*.className | 设置或返回元素的class属性 |
| *element*.clientHeight | 在页面上返回内容的可视高度(不包括边框,边距或滚动条) |
| *element*.clientWidth | 在页面上返回内容的可视宽度(不包括边框,边距或滚动条) |
| *element*.cloneNode() | 克隆某个元素 |
| *element*.compareDocumentPosition() | 比较两个元素的文档位置。 |
| *element*.contentEditable | 设置或返回元素的内容是否可编辑 |
| *element*.dir | 设置或返回一个元素中的文本方向 |
| *element*.firstChild | 返回元素的第一个子节点 |
| *element*.focus() | 设置文档或元素获取焦点 |
| *element*.getAttribute() | 返回指定元素的属性值 |
| *element*.getAttributeNode() | 返回指定属性节点 |
| *element*.getElementsByTagName() | 返回指定标签名的所有子元素集合。 |
| *element*. getElementsByClassName() | 返回文档中所有指定类名的元素集合,作为 NodeList 对象。 |
| *element*.getFeature() | 返回指定特征的执行APIs对象。 |
| *element*.getUserData() | 返回一个元素中关联键值的对象。 |
| *element*.hasAttribute() | 如果元素中存在指定的属性返回 true,否则返回false。 |
| *element*.hasAttributes() | 如果元素有任何属性返回true,否则返回false。 |
| *element*.hasChildNodes() | 返回一个元素是否具有任何子元素 |
| *element*.hasFocus() | 返回布尔值,检测文档或元素是否获取焦点 |
| *element*.id | 设置或者返回元素的 id。 |
| *element*.innerHTML | 设置或者返回元素的内容。 |
| *element*.insertBefore() | 现有的子元素之前插入一个新的子元素 |
| *element*.isContentEditable | 如果元素内容可编辑返回 true,否则返回false |
| *element*.isDefaultNamespace() | 如果指定了namespaceURI 返回 true,否则返回 false。 |
| *element*.isEqualNode() | 检查两个元素是否相等 |
| *element*.isSameNode() | 检查两个元素所有有相同节点。 |
| *element*.isSupported() | 如果在元素中支持指定特征返回 true。 |
| *element*.lang | 设置或者返回一个元素的语言。 |
| *element*.lastChild | 返回的最后一个子节点 |
| *element*.namespaceURI | 返回命名空间的 URI。 |
| *element*.nextSibling | 返回该元素紧跟的一个节点 |
| *element*.nextElementSibling | 返回指定元素之后的下一个兄弟元素(相同节点树层中的下一个元素节点)。 |
| *element*.nodeName | 返回元素的标记名(大写) |
| *element*.nodeType | 返回元素的节点类型 |
| *element*.nodeValue | 返回元素的节点值 |
| *element*.normalize() | 使得此成为一个"normal"的形式,其中只有结构(如元素,注释,处理指令,CDATA节和实体引用)隔开Text节点,即元素(包括属性)下面的所有文本节点,既没有相邻的文本节点也没有空的文本节点 |
| *element*.offsetHeight | 返回任何一个元素的高度包括边框和填充,但不是边距 |
| *element*.offsetWidth | 返回元素的宽度,包括边框和填充,但不是边距 |
| *element*.offsetLeft | 返回当前元素的相对水平偏移位置的偏移容器 |
| *element*.offsetParent | 返回元素的偏移容器 |
| *element*.offsetTop | 返回当前元素的相对垂直偏移位置的偏移容器 |
| *element*.ownerDocument | 返回元素的根元素(文档对象) |
| *element*.parentNode | 返回元素的父节点 |
| *element*.previousSibling | 返回某个元素紧接之前元素 |
| *element*.previousElementSibling | 返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点)。 |
| *element*.querySelector() | 返回匹配指定 CSS 选择器元素的第一个子元素 |
| document.querySelectorAll() | 返回匹配指定 CSS 选择器元素的所有子元素节点列表 |
| *element*.removeAttribute() | 从元素中删除指定的属性 |
| *element*.removeAttributeNode() | 删除指定属性节点并返回移除后的节点。 |
| *element*.removeChild() | 删除一个子元素 |
| *element*.removeEventListener() | 移除由 addEventListener() 方法添加的事件句柄 |
| *element*.replaceChild() | 替换一个子元素 |
| *element*.scrollHeight | 返回整个元素的高度(包括带滚动条的隐蔽的地方) |
| *element*.scrollLeft | 返回当前视图中的实际元素的左边缘和左边缘之间的距离 |
| *element*.scrollTop | 返回当前视图中的实际元素的顶部边缘和顶部边缘之间的距离 |
| *element*.scrollWidth | 返回元素的整个宽度(包括带滚动条的隐蔽的地方) |
| *element*.setAttribute() | 设置或者改变指定属性并指定值。 |
| *element*.setAttributeNode() | 设置或者改变指定属性节点。 |
| *element*.setIdAttribute() | |
| *element*.setIdAttributeNode() | |
| *element*.setUserData() | 在元素中为指定键值关联对象。 |
| *element*.style | 设置或返回元素的样式属性 |
| *element*.tabIndex | 设置或返回元素的标签顺序。 |
| *element*.tagName | 作为一个字符串返回某个元素的标记名(大写) |
| *element*.textContent | 设置或返回一个节点和它的文本内容 |
| *element*.title | 设置或返回元素的title属性 |
| *element*.toString() | 一个元素转换成字符串 |
| *nodelist*.item() | 返回某个元素基于文档树的索引 |
| *nodelist*.length | 返回节点列表的节点数目。 |
##### Attr 对象
在 HTML DOM 中, **Attr 对象** 代表一个 HTML 属性。
HTML属性总是属于HTML元素。
##### NamedNodeMap 对象
在 HTML DOM 中, the **NamedNodeMap 对象** 表示一个无顺序的节点列表。
我们可通过节点名称来访问 NamedNodeMap 中的节点。
所有主流浏览器都支持 Attr 对象和 NamedNodeMap 对象。
| 属性 / 方法 | 描述 |
| --- | --- |
| *attr*.isId | 如果属性是 ID 类型,则 isId 属性返回 true,否则返回 false。 |
| *attr*.name | 返回属性名称 |
| *attr*.value | 设置或者返回属性值 |
| *attr*.specified | 如果属性被指定返回 true ,否则返回 false |
| *nodemap*.getNamedItem() | 从节点列表中返回的指定属性节点。 |
| *nodemap*.item() | 返回节点列表中处于指定索引号的节点。 |
| *nodemap*.length | 返回节点列表的节点数目。 |
| *nodemap*.removeNamedItem() | 删除指定属性节点 |
| *nodemap*.setNamedItem() | 设置指定属性节点(通过名称) |
#### 3.2 DOM事件
HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序。
鼠标事件
| 属性 | 描述 |
| --- | --- |
| onclick | 当用户点击某个对象时调用的事件句柄。 |
| oncontextmenu | 在用户点击鼠标右键打开上下文菜单时触发 |
| ondblclick | 当用户双击某个对象时调用的事件句柄。 |
| onmousedown | 鼠标按钮被按下。 |
| onmouseenter | 当鼠标指针移动到元素上时触发。 |
| onmouseleave | 当鼠标指针移出元素时触发 |
| onmousemove | 鼠标被移动。 |
| onmouseover | 鼠标移到某元素之上。 |
| onmouseout | 鼠标从某元素移开。 |
| onmouseup | 鼠标按键被松开。 |
点击事件例子:
~~~
<!DOCTYPE html>
<html lang="en">
<head>
<script>
function al(){
alert(1);
}
</script>
</head>
<body>
<p onclick="al()">a</p>
</body>
</html>
~~~
:-: ![](https://img.kancloud.cn/66/47/66474f492c61ffc8ce1d15f48f736210_518x221.png)
:-: ![](https://img.kancloud.cn/f7/a4/f7a4206ab62181323b9a3c39d8ff2768_517x236.png)
上面我们为`<p>`元素添加了点击事件绑定了al()函数。所以点击`<p>`元素时会触发点击事件执行al()方法。
键盘事件
| 属性 | 描述 |
| --- | --- |
| onkeydown | 某个键盘按键被按下。 |
| onkeypress | 某个键盘按键被按下并松开。 |
| onkeyup | 某个键盘按键被松开。 |
鼠标按下事件例子:
~~~
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<meta charset="utf-8">
<script>
function tryDown(){
alert("你已按下");
}
</script>
</head>
<body>
<p>尝试按下一个键</p>
<input type="text" onkeydown="tryDown()">
</body>
</html>
~~~
:-: ![](https://img.kancloud.cn/13/20/132062ae6180a2b8acf03313a4a2770c_517x226.png)
:-: ![](https://img.kancloud.cn/6e/5f/6e5f7b67b52a4762ef80405c58c40c5c_516x230.png)
上面我们为`<input>`元素添加鼠标按下事件并绑定tryDown()方法。将光标移动到`<input>`元素上再按下一个键时就会触发tryDown()方法。
框架/对象(Frame/Object)事件
| 属性 | 描述 |
| --- | --- |
| onabort | 图像的加载被中断。 ( ) |
| onbeforeunload | 该事件在即将离开页面(刷新或关闭)时触发 |
| onerror | 在加载文档或图像时发生错误。 ( , 和 ) |
| onhashchange | 该事件在当前 URL 的锚部分发生修改时触发。 |
| onload | 一张页面或一幅图像完成加载。 |
| onpageshow | 该事件在用户访问页面时触发 |
| onpagehide | 该事件在用户离开当前网页跳转到另外一个页面时触发 |
| onresize | 窗口或框架被重新调整大小。 |
| onscroll | 当文档被滚动时发生的事件。 |
| onunload | 用户退出页面。 ( 和 ) |
表单事件
| 属性 | 描述 |
| --- | --- |
| onblur | 元素失去焦点时触发 |
| onchange | 该事件在表单元素的内容改变时触发( , , , 和 ) |
| onfocus | 元素获取焦点时触发 |
| onfocusin | 元素即将获取焦点时触发 |
| onfocusout | 元素即将失去焦点时触发 |
| oninput | 元素获取用户输入时触发 |
| onreset | 表单重置时触发 |
| onsearch | 用户向搜索域输入文本时触发 ( ) |
| onselect | 用户选取文本时触发 ( 和 ) |
| onsubmit | 表单提交时触发 |
剪贴板事件
| 属性 | 描述 |
| --- | --- |
| oncopy | 该事件在用户拷贝元素内容时触发 |
| oncut | 该事件在用户剪切元素内容时触发 |
| onpaste | 该事件在用户粘贴元素内容时触发 |
打印事件
| 属性 | 描述 |
| --- | --- |
| onafterprint | 该事件在页面已经开始打印,或者打印窗口已经关闭时触发 |
| onbeforeprint | 该事件在页面即将开始打印时触发 |
拖动事件
| 事件 | 描述 |
| --- | --- |
| ondrag | 该事件在元素正在拖动时触发 |
| ondragend | 该事件在用户完成元素的拖动时触发 |
| ondragenter | 该事件在拖动的元素进入放置目标时触发 |
| ondragleave | 该事件在拖动元素离开放置目标时触发 |
| ondragover | 该事件在拖动元素在放置目标上时触发 |
| ondragstart | 该事件在用户开始拖动元素时触发 |
| ondrop | 该事件在拖动元素放置在目标区域时触发 |
多媒体(Media)事件
| 事件 | 描述 |
| --- | --- |
| onabort | 事件在视频/音频(audio/video)终止加载时触发。 |
| oncanplay | 事件在用户可以开始播放视频/音频(audio/video)时触发。 |
| oncanplaythrough | 事件在视频/音频(audio/video)可以正常播放且无需停顿和缓冲时触发。 |
| ondurationchange | 事件在视频/音频(audio/video)的时长发生变化时触发。 |
| onemptied | 当期播放列表为空时触发 |
| onended | 事件在视频/音频(audio/video)播放结束时触发。 |
| onerror | 事件在视频/音频(audio/video)数据加载期间发生错误时触发。 |
| onloadeddata | 事件在浏览器加载视频/音频(audio/video)当前帧时触发触发。 |
| onloadedmetadata | 事件在指定视频/音频(audio/video)的元数据加载后触发。 |
| onloadstart | 事件在浏览器开始寻找指定视频/音频(audio/video)触发。 |
| onpause | 事件在视频/音频(audio/video)暂停时触发。 |
| onplay | 事件在视频/音频(audio/video)开始播放时触发。 |
| onplaying | 事件在视频/音频(audio/video)暂停或者在缓冲后准备重新开始播放时触发。 |
| onprogress | 事件在浏览器下载指定的视频/音频(audio/video)时触发。 |
| onratechange | 事件在视频/音频(audio/video)的播放速度发送改变时触发。 |
| onseeked | 事件在用户重新定位视频/音频(audio/video)的播放位置后触发。 |
| onseeking | 事件在用户开始重新定位视频/音频(audio/video)时触发。 |
| onstalled | 事件在浏览器获取媒体数据,但媒体数据不可用时触发。 |
| onsuspend | 事件在浏览器读取媒体数据中止时触发。 |
| ontimeupdate | 事件在当前的播放位置发送改变时触发。 |
| onvolumechange | 事件在音量发生改变时触发。 |
| onwaiting | 事件在视频由于要播放下一帧而需要缓冲时触发。 |
动画事件
| 事件 | 描述 |
| --- | --- |
| animationend | 该事件在 CSS 动画结束播放时触发 |
| animationiteration | 该事件在 CSS 动画重复播放时触发 |
| animationstart | 该事件在 CSS 动画开始播放时触发 |
过渡事件
| 事件 | 描述 |
| --- | --- |
| transitionend | 该事件在 CSS 完成过渡后触发。 |
其他事件
| 事件 | 描述 |
| --- | --- |
| onmessage | 该事件通过或者从对象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息时触发 |
| onmousewheel | 已废弃。 使用 onwheel 事件替代 |
| ononline | 该事件在浏览器开始在线工作时触发。 |
| onoffline | 该事件在浏览器开始离线工作时触发。 |
| onpopstate | 该事件在窗口的浏览历史(history 对象)发生改变时触发。 |
| onshow | 该事件当 元素在上下文菜单显示时触发 |
| onstorage | 该事件在 Web Storage(HTML 5 Web 存储)更新时触发 |
| ontoggle | 该事件在用户打开或关闭 元素时触发 |
| onwheel | 该事件在鼠标滚轮在元素上下滚动时触发 |
#### 事件对象
常量
| 静态变量 | 描述 |
| --- | --- |
| CAPTURING-PHASE | 当前事件阶段为捕获阶段(1) |
| AT-TARGET | 当前事件是目标阶段,在评估目标事件(1) |
| BUBBLING-PHASE | 当前的事件为冒泡阶段 (3) |
属性
| 属性 | 描述 |
| --- | --- |
| bubbles | 返回布尔值,指示事件是否是起泡事件类型。 |
| cancelable | 返回布尔值,指示事件是否可拥可取消的默认动作。 |
| currentTarget | 返回其事件监听器触发该事件的元素。 |
| eventPhase | 返回事件传播的当前阶段。 |
| target | 返回触发此事件的元素(事件的目标节点)。 |
| timeStamp | 返回事件生成的日期和时间。 |
| type | 返回当前 Event 对象表示的事件的名称。 |
方法
| 方法 | 描述 |
| --- | --- |
| initEvent() | 初始化新创建的 Event 对象的属性。 |
| preventDefault() | 通知浏览器不要执行与事件关联的默认动作。 |
| stopPropagation() | 不再派发事件。 |
#### 目标事件对象
方法
| 方法 | 描述 |
| --- | --- |
| addEventListener() | 允许在目标事件中注册监听事件(IE8 = attachEvent()) |
| dispatchEvent() | 允许发送事件到监听器上 (IE8 = fireEvent()) |
| removeEventListener() | 运行一次注册在事件目标上的监听事件(IE8 = detachEvent()) |
事件监听对象
方法
| 方法 | 描述 |
| --- | --- |
| handleEvent() | 把任意对象注册为事件处理程序 |
#### 文档事件对象
方法
| 方法 | 描述 |
| --- | --- |
| createEvent() | |
#### 鼠标/键盘事件对象
属性
| 属性 | 描述 |
| --- | --- |
| altKey | 返回当事件被触发时,"ALT" 是否被按下。 |
| button | 返回当事件被触发时,哪个鼠标按钮被点击。 |
| clientX | 返回当事件被触发时,鼠标指针的水平坐标。 |
| clientY | 返回当事件被触发时,鼠标指针的垂直坐标。 |
| ctrlKey | 返回当事件被触发时,"CTRL" 键是否被按下。 |
| Location | 返回按键在设备上的位置 |
| charCode | 返回onkeypress事件触发键值的字母代码。 |
| key | 在按下按键时返回按键的标识符。 |
| keyCode | 返回onkeypress事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码。 |
| which | 返回onkeypress事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码。 |
| metaKey | 返回当事件被触发时,"meta" 键是否被按下。 |
| relatedTarget | 返回与事件的目标节点相关的节点。 |
| screenX | 返回当某个事件被触发时,鼠标指针的水平坐标。 |
| screenY | 返回当某个事件被触发时,鼠标指针的垂直坐标。 |
| shiftKey | 返回当事件被触发时,"SHIFT" 键是否被按下。 |
方法
| 方法 | 描述 |
| --- | --- |
| initMouseEvent() | 初始化鼠标事件对象的值 |
| initKeyboardEvent() | 初始化键盘事件对象的值 |
##### 计时事件
通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。
在 JavaScritp 中使用计时事件是很容易的,两个关键方法是:
* setInterval() - 间隔指定的毫秒数不停地执行指定的代码。
~~~
var myVar=setInterval(function(){myTimer()},1000);
function myTimer()
{
var d=new Date();
var t=d.toLocaleTimeString();
document.getElementById("demo").innerHTML=t;
}
~~~
* setTimeout() - 在指定的毫秒数后执行指定代码。
~~~
setTimeout(function(){alert("Hello")},3000);
~~~
clearInterval() 方法用于停止 setInterval() 方法执行的函数代码。
clearTimeout() 方法用于停止执行setTimeout()方法的函数代码。
#### 3.3 其他对象
##### Console 对象
Console 对象提供了访问浏览器调试模式的信息到控制台。
| 方法 | 描述 |
| --- | --- |
| assert() | 如果断言为 false,则在信息到控制台输出错误信息。 |
| clear() | 清除控制台上的信息。 |
| count() | 记录 count() 调用次数,一般用于计数。 |
| error() | 输出错误信息到控制台 |
| group() | 在控制台创建一个信息分组。 一个完整的信息分组以 console.group() 开始,console.groupEnd() 结束 |
| groupCollapsed() | 在控制台创建一个信息分组。 类似 console.group() ,但它默认是折叠的。 |
| groupEnd() | 设置当前信息分组结束 |
| info() | 控制台输出一条信息 |
| log() | 控制台输出一条信息 |
| table() | 以表格形式显示数据 |
| time() | 计时器,开始计时间,与 timeEnd() 联合使用,用于算出一个操作所花费的准确时间。 |
| timeEnd() | 计时结束 |
| trace() | 显示当前执行的代码在堆栈中的调用路径。 |
| warn() | 输出警告信息,信息最前面加一个黄色三角,表示警告 |
##### CSS 样式声明对象
CSSStyleDeclaration 对象属性
| 属性 | 描述 |
| --- | --- |
| cssText | 设置或返回样式声明文本,cssText 对应的是 HTML 元素的 style 属性。 |
| length | 返回样式中包含多少条声明。 |
| parentRule | 返回包含当前规则的规则。 |
~~~
var elmnt = document.getElementsByTagName("h1")[0];
var x = elmnt.style.cssText;
~~~
CSSStyleDeclaration 对象方法
| 方法 | 描述 |
| --- | --- |
| getPropertyPriority() | 返回指定的 CSS 属性是否设置了 "important!" 属性。 |
| getPropertyValue() | 返回指定的 CSS 属性值。 |
| item() | 通过索引方式返回 CSS 声明中的 CSS 属性名。 |
| removeProperty() | 移除 CSS 声明中的 CSS 属性。 |
| setProperty() | 在 CSS 声明块中新建或者修改 CSS 属性。 |
~~~
var style = document.getElementById("ex1").style;
var propname = style.item(0);
alert(propname);
~~~
##### HTMLCollection对象
下表列出了 HTMLCollection 对象中的属性和方法:
| 属性 / 方法 | 描述 |
| --- | --- |
| item() | 返回 HTMLCollection 中指定索引的元素。 |
| length | 返回 HTMLCollection 中元素的数量。 |
| namedItem() | 返回 HTMLCollection 中指定 ID 或 name 属性的元素。 |
#### 3.4 Window - 浏览器对象模型 BOM
##### Window 对象
所有浏览器都支持 window 对象。它表示浏览器窗口。
所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
全局变量是 window 对象的属性。
全局函数是 window 对象的方法。
##### Window 尺寸
* window.innerHeight - 浏览器窗口的内部高度(包括滚动条)
* window.innerWidth - 浏览器窗口的内部宽度(包括滚动条)
* window.open() - 打开新窗口
* window.close() - 关闭当前窗口
* window.moveTo() - 移动当前窗口
* window.resizeTo() - 调整当前窗口的尺寸
* screen.availWidth - 可用的屏幕宽度
* screen.availHeight - 可用的屏幕高度
* location.hostname 返回 web 主机的域名
* location.pathname 返回当前页面的路径和文件名
* location.port 返回 web 主机的端口 (80 或 443)
* location.protocol 返回所使用的 web 协议(http: 或 https:)
* history.back() - 与在浏览器点击后退按钮相同
* history.forward() - 与在浏览器中点击向前按钮相同
* history.go(-1) -倒退1页
##### Window Navigator
window.navigator 对象在编写时可不使用 window 这个前缀。
~~~
<div id="example"></div>
<script>
txt = "<p>浏览器代号: " + navigator.appCodeName + "</p>";
txt+= "<p>浏览器名称: " + navigator.appName + "</p>";
txt+= "<p>浏览器版本: " + navigator.appVersion + "</p>";
txt+= "<p>启用Cookies: " + navigator.cookieEnabled + "</p>";
txt+= "<p>硬件平台: " + navigator.platform + "</p>";
txt+= "<p>用户代理: " + navigator.userAgent + "</p>";
txt+= "<p>用户代理语言: " + navigator.systemLanguage + "</p>";
document.getElementById("example").innerHTML=txt;
</script>
~~~
##### 警告框
~~~
window.alert("sometext");
~~~
##### 确认框
~~~
window.confirm("sometext");
~~~
##### 提示输入
~~~
window.prompt("sometext","defaultvalue");
~~~
#### 3.5 Javascript Cookie及本地存储
##### 3.5.1 Cookie
当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息。
Cookie 的作用就是用于解决 "如何记录客户端的用户信息":
* 当用户访问 web 页面时,他的名字可以记录在 cookie 中。
* 在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录。
创建cookie
~~~
document.cookie="username=John Doe";
~~~
修改cookie
~~~
document.cookie="username=John Smith; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";
~~~
删除cookie
~~~
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
~~~
设置 cookie值的函数
~~~
function setCookie(cname,cvalue,exdays)
{
var d = new Date();
d.setTime(d.getTime()+(exdays*24*60*60*1000));
var expires = "expires="+d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
~~~
获取 cookie 值的函数
~~~
function getCookie(cname)
{
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++)
{
var c = ca[i].trim();
if (c.indexOf(name)==0) return c.substring(name.length,c.length);
}
return "";
}
~~~
例子:
~~~
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>
window.onload = function () {
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
}
return "";
}
setCookie('a', '10', 10);
alert(getCookie('a'));
}
</script>
</head>
</html>
~~~
:-: ![](https://img.kancloud.cn/96/11/9611e01db2c17705f088b30d85130410_523x272.png)
:-: ![](https://img.kancloud.cn/97/2e/972ee072586c61ead63f6b0e5bbff628_520x380.png)
我们发现已经成功设置Cookie:a=10。
##### 3.5.2 本地存储
localStorage 对象存储的是没有截止日期的数据。当浏览器被关闭时数据不会被删除,在下一天、周或年中,都是可用的。
~~~
// 存储
localStorage.setItem("lastname", "Gates");
// 取回
document.getElementById("result").innerHTML = localStorage.getItem("lastname");
~~~
sessionStorage 对象等同 localStorage 对象,不同之处在于只对一个 session 存储数据。如果用户关闭具体的浏览器标签页,数据也会被删除。
~~~
if (sessionStorage.clickcount) {
sessionStorage.clickcount = Number(sessionStorage.clickcount) + 1;
} else {
sessionStorage.clickcount = 1;
}
document.getElementById("result").innerHTML = "在本 session 中,您已经点击这个按钮 " +
sessionStorage.clickcount + " 次。";
~~~
#### 3.6 JavaScript 用法
HTML中的javascript脚本必须位于`<script>` `</script>`标签之间
脚本可以放置于`<body>` 和 `<head>`部分中
~~~
<!DOCTYPE html>
<html>
<head>
<script>
function myFunction()
{
document.getElementById("demo").innerHTML="我的第一个 JavaScript 函数";
}
</script>
</head>
<body>
<h1>我的 Web 页面</h1>
<p id="demo">一个段落</p>
<button type="button" onclick="myFunction()">尝试一下</button>
</body>
</html>
~~~
##### 外部引用
~~~
<!DOCTYPE html>
<html>
<body>
<script src="myScript.js"></script>
</body>
</html>
~~~
##### JavaScript 变量
~~~
var x, length
x = 5
length = 6
~~~
##### JavaScript 操作符
~~~
x = 5
y = 6
z = (x + y) * 10
~~~
| 类型 | 实例 | 描述 |
| --- | --- | --- |
| 赋值,算术和位运算符 | \= + - \* / | 在 JS 运算符中描述 |
| 条件,比较及逻辑运算符 | \== != | 在 JS 比较运算符中描述 |
##### JavaScript 注释
~~~
// 我不会执行
~~~
##### JavaScript 语句标识符
JavaScript 语句通常以一个 语句标识符 为开始,并执行该语句。
语句标识符是保留关键字不能作为变量名使用。
下表列出了 JavaScript 语句标识符 (关键字) :
| 语句 | 描述 |
| --- | --- |
| break | 用于跳出循环。 |
| catch | 语句块,在 try 语句块执行出错时执行 catch 语句块。 |
| continue | 跳过循环中的一个迭代。 |
| do ... while | 执行一个语句块,在条件语句为 true 时继续执行该语句块。 |
| for | 在条件语句为 true 时,可以将代码块执行指定的次数。 |
| for ... in | 用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。 |
| function | 定义一个函数 |
| if ... else | 用于基于不同的条件来执行不同的动作。 |
| return | 退出函数 |
| switch | 用于基于不同的条件来执行不同的动作。 |
| throw | 抛出(生成)错误 。 |
| try | 实现错误处理,与 catch 一同使用。 |
| var | 声明一个变量。 |
| while | 当条件语句为 true 时,执行语句块。 |
#### 3.7 JavaScript 数据类型
在 JavaScript 中有 6 种不同的数据类型:
* string
* number
* boolean
* object
* function
* symbol
3 种对象类型:
* Object
* Date
* Array
2 个不包含任何值的数据类型:
* null
* undefined
##### JavaScript 字符串
~~~
var answer="It's alright";
var answer="He is called 'Johnny'";
var answer='He is called "Johnny"';
~~~
##### JavaScript 数字
~~~
var x1=34.00; //使用小数点来写
var x2=34; //不使用小数点来写
var y=123e5; // 12300000
var z=123e-5; // 0.00123
~~~
##### JavaScript 布尔
~~~
var x=true;
var y=false;
~~~
##### JavaScript 数组
~~~
var cars=new Array();
cars[0]="Saab";
cars[1]="Volvo";
cars[2]="BMW";
var cars=new Array("Saab","Volvo","BMW");
var cars=["Saab","Volvo","BMW"];
~~~
##### JavaScript 对象
~~~
var person={firstname:"John", lastname:"Doe", id:5566};
var person={
firstname : "John",
lastname : "Doe",
id : 5566
};
~~~
对象属性有两种寻址方式:
~~~
name=person.lastname;
name=person["lastname"];
~~~
##### Undefined 和 Null
Undefined 这个值表示变量不含有值。
可以通过将变量的值设置为 null 来清空变量。
##### 声明变量类型
~~~
var carname=new String;
var x= new Number;
var y= new Boolean;
var cars= new Array;
var person= new Object;
~~~
##### typeof 操作符
用于获得数据类型。
~~~
typeof "John" // 返回 string
typeof 3.14 // 返回 number
typeof false // 返回 boolean
typeof [1,2,3,4] // 返回 object
typeof {name:'John', age:34} // 返回 object
~~~
##### undefined 和 null 的区别
null 和 undefined 的值相等,但类型不等
在 JavaScript 中 null 表示 "什么都没有"
在 JavaScript 中, undefined 是一个没有设置值的变量。
~~~
typeof undefined // undefined
typeof null // object
null === undefined // false
null == undefined // tru
~~~
**String()** 可以将数字转换为字符串。
~~~
String(x) // 将变量 x 转换为字符串并返回
String(123) // 将数字 123 转换为字符串并返回
String(100 + 23) // 将数字表达式转换为字符串并返回
String(false) // 返回 "false"
String(true) // 返回 "true"
String(new Date()) // 返回 Thu Jul 17 2014 15:38:19 GMT+0200 (W. Europe Daylight Time)
~~~
Number 方法 **toString()** 也是有同样的效果。
~~~
x.toString()
(123).toString()
(100 + 23).toString()
~~~
Date 方法 **toString()** 也有相同的效果。
~~~
obj = new Date()
obj.toString() // 返回 Thu Jul 17 2014 15:38:19 GMT+0200 (W. Europe Daylight Time)
~~~
**Number()** 可以将字符串转换为数字。
~~~
Number("3.14") // 返回 3.14
Number(" ") // 返回 0
Number("") // 返回 0
Number("99 88") // 返回 NaN
Number(false) // 返回 0
Number(true) // 返回 1
d = new Date();
Number(d) // 返回 1404568027739
~~~
日期方法 **getTime()** 也有相同的效果。
~~~
d = new Date();
d.getTime() // 返回 1404568027739
~~~
##### 一元运算符 +
**Operator +** 可用于将变量转换为数字:
~~~
var y = "5"; // y 是一个字符串
var x = + y; // x 是一个数字
~~~
如果变量不能转换,它仍然会是一个数字,但值为 NaN (不是一个数字):
~~~
var y = "John"; // y 是一个字符串
var x = + y; // x 是一个数字 (NaN)
~~~
##### 自动转换类型
~~~
5 + null // 返回 5 null 转换为 0
"5" + null // 返回"5null" null 转换为 "null"
"5" + 1 // 返回 "51" 1 转换为 "1"
"5" - 1 // 返回 4 "5" 转换为 5
~~~
#### 3.8 JavaScript 对象
真实生活中的对象,属性和方法
| 对象 | 属性 | 方法 |
| -- | --- | --- |
| ![](https://img.kancloud.cn/9f/11/9f11815dc2382a2f347f69524d16d3de_97x107.png)|lastModify=1627150258) | man.name = Tom man.age= 30 man.weight = 80kg man.color = black | man.eat() man.walk() man.study() man.stop() |
所有人都有这些属性,但是每个人的属性都不尽相同。
所有人都拥有这些方法,但是它们被执行的时间都不尽相同。
##### 对象定义
~~~
var person = {
firstName:"Tom",
lastName:"Doe",
age:50,
eyeColor:"blue"
fun:function(){
alert(1);
}
};
~~~
##### 访问对象属性
~~~
person.lastName;
person["lastName"];
~~~
##### 对象方法
~~~
name = person.fullName();
name = person.fullName;(不加括号会将函数字符串作为属性返回)
~~~
##### JavaScript 函数语法
函数就是包裹在花括号中的代码块,前面使用了关键词 function:
~~~
function method()
{
// code
}
~~~
##### 调用带参数的函数
声明函数
~~~
function myFunction(var1,var2)
{
code
}
~~~
使用函数
~~~
var x = myFunction(argument1,argument2);
~~~
##### 带有返回值的函数
在使用 return 语句时,函数会停止执行,并返回指定的值。
~~~
function myFunction()
{
var x=5;
return x;
}
~~~
#### 3.9 JavaScript 变量
##### 3.9.1 变量
##### 局部 JavaScript 变量
在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它。(该变量的作用域是局部的)。
您可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量。
只要函数运行完毕,本地变量就会被删除。
##### 全局 JavaScript 变量
在函数外声明的变量是*全局*变量,网页上的所有脚本和函数都能访问它。
##### JavaScript 变量的生存期
JavaScript 变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。
##### 向未声明的 JavaScript 变量分配值
如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。
如这条语句:
carname="Volvo";
##### 3.9.2 变量的作用域
变量在函数内声明,变量为局部作用域。
~~~
// 此处不能调用 carName 变量
function myFunction() {
var carName = "Volvo";
// 函数内可调用 carName 变量
}
~~~
##### JavaScript 全局变量
~~~
var carName = " Volvo";
// 此处可调用 carName 变量
function myFunction() {
// 函数内可调用 carName 变量
}
~~~
如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。
~~~
// 此处可调用 carName 变量
function myFunction() {
carName = "Volvo";
// 此处可调用 carName 变量
}
~~~
##### 3.9.3 JavaScript 变量生命周期
JavaScript 变量生命周期在它声明时初始化。
局部变量在函数执行完毕后销毁。
全局变量在页面关闭后销毁。
##### 3.9.4 let 和 const
let 声明的变量只在 let 命令所在的代码块内有效。
const 声明一个只读的常量,一旦声明,常量的值就不能改变。
在 ES6 之前,JavaScript 只有两种作用域: **全局变量** 与 **函数内的局部变量**。
在 ES6 之前,是没有块级作用域的概念的。
ES6 可以使用 let 关键字来实现块级作用域。
let 声明的变量只在 let 命令所在的代码块 **{}** 内有效,在 **{}** 之外不能访问。
~~~
{
let x = 2;
}
// 这里不能使用 x 变量
~~~
const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:
~~~
const PI = 3.141592653589793;
PI = 3.14; // 报错
PI = PI + 10; // 报错
~~~
#### 3.10 运算符
JavaScript 算术运算符
| 运算符 | 描述 | 例子 | x 运算结果 | y 运算结果 |
| --- | --- | --- | --- | --- |
| + | 加法 | x=y+2 | 7 | 5 |
| \- | 减法 | x=y-2 | 3 | 5 |
| \* | 乘法 | x=y\*2 | 10 | 5 |
| / | 除法 | x=y/2 | 2.5 | 5 |
| % | 取模(余数) | x=y%2 | 1 | 5 |
| ++ | 自增 | x=++y | 6 | 6 |
| x=y++ | 5 | 6 | | |
| \-- | 自减 | x=--y | 4 | 4 |
| x=y-- | 5 | 4 | | |
##### 赋值运算符
赋值运算符用于给 JavaScript 变量赋值。
| 运算符 | 例子 | 等同于 | 运算结果 |
| --- | --- | --- | --- |
| \= | x=y | | x=5 |
| += | x+=y | x=x+y | x=15 |
| \-= | x-=y | x=x-y | x=5 |
| \*= | x\*=y | x=x\*y | x=50 |
| /= | x/=y | x=x/y | x=2 |
| %= | x%=y | x=x%y | x=0 |
##### 用于字符串的 + 运算符
~~~
txt1="What a very";
txt2="nice day";
txt3=txt1+txt2;
运算结果txt3的值为What a verynice day
~~~
##### 对字符串和数字进行加法运算
~~~
x=5+5;
y="5"+5;
z="Hello"+5;
运算结果
10
55
Hello5
~~~
##### 比较运算符
比较运算符在逻辑语句中使用,以测定变量或值是否相等。
x=5,下面的表格解释了比较运算符:
| 运算符 | 描述 | 比较 | 返回值 |
| --- | --- | --- | --- |
| \== | 等于 | x==8 | *false* |
| x==5 | *true* | | |
| \=== | 绝对等于(值和类型均相等) | x==="5" | *false* |
| x===5 | *true* | | |
| != | 不等于 | x!=8 | *true* |
| !== | 不绝对等于(值和类型有一个不相等,或两个都不相等) | x!=="5" | *true* |
| x!==5 | \*false | | |
| \> | 大于 | x>8 | *false* |
| < | 小于 | x<8 | *true* |
| \>= | 大于或等于 | x>=8 | *false* |
| <= | 小于或等于 | | |
##### 逻辑运算符
逻辑运算符用于测定变量或值之间的逻辑。
给定 x=6 以及 y=3,下表解释了逻辑运算符:
| 运算符 | 描述 | 例子 |
| --- | --- | --- |
| && | and | (x 1) 为 true |
| || | or | (x==5 || y==5) 为 false |
| ! | not | !(x==y) 为 true |
#### 3.11 流程控制
##### if 语句
只有当指定条件为 true 时,该语句才会执行代码。
~~~
if (condition)
{
当条件为 true 时执行的代码
}
~~~
##### if...else 语句
请使用 if....else 语句在条件为 true 时执行代码,在条件为 false 时执行其他代码。
~~~
if (condition)
{
当条件为 true 时执行的代码
}
else
{
当条件不为 true 时执行的代码
}
~~~
##### if...else if...else 语句
使用 if....else if...else 语句来选择多个代码块之一来执行。
~~~
if (condition1)
{
当条件 1 为 true 时执行的代码
}
else if (condition2)
{
当条件 2 为 true 时执行的代码
}
else
{
当条件 1 和 条件 2 都不为 true 时执行的代码
}
~~~
##### 三元表达式
~~~
voteable=(age<18)?"年龄太小":"年龄已达到";
~~~
##### JavaScript switch 语句
请使用 switch 语句来选择要执行的多个代码块之一。
~~~
switch(n)
{
case 1:
执行代码块 1
break;
case 2:
执行代码块 2
break;
default:
与 case 1 和 case 2 不同时执行的代码
}
~~~
default 关键词
~~~
var d=new Date().getDay();
switch (d)
{
case 6:x="今天是星期六";
break;
case 0:x="今天是星期日";
break;
default:
x="期待周末";
}
document.getElementById("demo").innerHTML=x;
~~~
##### JavaScript 循环
一般写法
~~~
document.write(cars[0] + "<br>");
document.write(cars[1] + "<br>");
document.write(cars[2] + "<br>");
document.write(cars[3] + "<br>");
document.write(cars[4] + "<br>");
document.write(cars[5] + "<br>");
~~~
for循环
~~~
for (var i=0;i<cars.length;i++)
{
document.write(cars[i] + "<br>");
}
~~~
For/In 循环
遍历对象属性
~~~
var person={fname:"Bill",lname:"Gates",age:56};
for (x in person) // x 为属性名
{
txt=txt + person[x];
}
~~~
##### while 循环
while 循环会在指定条件为真时循环执行代码块。
~~~
while (条件)
{
需要执行的代码
}
~~~
##### do/while 循环
do/while 循环是 while 循环的变体。该循环会在检查条件是否为真之前执行一次代码块,然后如果条件为真的话,就会重复这个循环。
~~~
do
{
x=x + "The number is " + i + "<br>";
i++;
}
while (i<5);
~~~
##### break 和 continue 语句
break 语句用于跳出循环。
continue 用于跳过循环中的一个迭代。
##### break 语句
break 语句可用于跳出循环。
break 语句跳出循环后,会继续执行该循环之后的代码(如果有的话):
break语句可以跳出swich()。
~~~
for (i=0;i<10;i++)
{
if (i==3)
{
break;
}
x=x + "The number is " + i + "<br>";
}
~~~
##### continue 语句
中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代。
~~~
for (i=0;i<=10;i++)
{
if (i==3) continue;
x=x + "The number is " + i + "<br>";
}
~~~
#### 3.12 JavaScript 正则表达式
正则表达式是由一个字符序列形成的搜索模式。当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。正则表达式可以是一个简单的字符,或一个更复杂的模式。正则表达式可用于所有文本搜索和文本替换的操作。
##### 使用字符串方法
在 JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。
**search() 方法** 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
**replace() 方法** 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
##### search() 方法使用正则表达式
~~~
var str = "Visit Runoob!";
var n = str.search(/Runoob/i);
~~~
##### search() 方法使用字符串
~~~
var str = "Visit Runoob!";
var n = str.search("Runoob");
~~~
##### replace() 方法使用正则表达式
~~~
var str = document.getElementById("demo").innerHTML;
var txt = str.replace(/microsoft/i,"Runoob");
~~~
##### replace() 方法使用字符串
~~~
var str = document.getElementById("demo").innerHTML;
var txt = str.replace("Microsoft","Runoob");
~~~
##### 正则表达式修饰符
**修饰符** 可以在全局搜索中不区分大小写:
| 修饰符 | 描述 |
| --- | --- |
| i | 执行对大小写不敏感的匹配。 |
| g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
| m | 执行多行匹配。 |
##### 正则表达式模式
方括号用于查找某个范围内的字符:
| 表达式 | 描述 |
| --- | --- |
| \[abc\] | 查找方括号之间的任何字符。 |
| \[0-9\] | 查找任何从 0 至 9 的数字。 |
| (x|y) | 查找任何以 | 分隔的选项。 |
元字符是拥有特殊含义的字符:
| 元字符 | 描述 |
| --- | --- |
| \\d | 查找数字。 |
| \\s | 查找空白字符。 |
| \\b | 匹配单词边界。 |
| \\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
量词:
| 量词 | 描述 |
| --- | --- |
| n+ | 匹配任何包含至少一个 *n* 的字符串。 |
| n\* | 匹配任何包含零个或多个 *n* 的字符串。 |
| n? | 匹配任何包含零个或一个 *n* 的字符串。 |
#### 3.13 抛出错误(throw)
##### JavaScript try 和 catch
**try** 语句允许我们定义在执行时进行错误测试的代码块。
**catch** 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。
JavaScript 语句 **try** 和 **catch** 是成对出现的。
~~~
try {
... //异常的抛出
} catch(e) {
... //异常的捕获与处理
} finally {
... //结束处理
}
~~~
##### finally 语句
~~~
function myFunction() {
var message, x;
message = document.getElementById("p01");
message.innerHTML = "";
x = document.getElementById("demo").value;
try {
if(x == "") throw "值是空的";
if(isNaN(x)) throw "值不是一个数字";
x = Number(x);
if(x > 10) throw "太大";
if(x < 5) throw "太小";
}
catch(err) {
message.innerHTML = "错误: " + err + ".";
}
finally {
document.getElementById("demo").value = "";
}
}
~~~
#### 3.14 this关键字
面向对象语言中 this 表示当前对象的一个引用。
但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。
* 在方法中,this 表示该方法所属的对象。
* 如果单独使用,this 表示全局对象。
* 在函数中,this 表示全局对象。
* 在函数中,在严格模式下,this 是未定义的(undefined)。
* 在事件中,this 表示接收事件的元素。
* 类似 call() 和 apply() 方法可以将 this 引用到任何对象。
~~~
var person = {
firstName: "John",
lastName : "Doe",
id : 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
~~~
在对象方法中, this 指向调用它所在方法的对象。
在上面一个实例中,this 表示 person 对象。
fullName 方法所属的对象就是 person。
~~~
fullName : function() {
return this.firstName + " " + this.lastName;
}
~~~
单独使用 this,则它指向全局(Global)对象。
在浏览器中,window 就是该全局对象为 \[**object Window**\]:
~~~
var x = this;
~~~
在函数中,函数的所属者默认绑定到 this 上。
在浏览器中,window 就是该全局对象为 \[**object Window**\]:
~~~
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h2>JavaScript <b>this</b> 关键字</h2>
<p>实例中,<b>this</b> 表示 myFunction 函数的所有者:</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = myFunction();
function myFunction() {
return this;
}
</script>
</body>
</html>
~~~
在 HTML 事件句柄中,this 指向了接收事件的 HTML 元素:
~~~
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>教程</title>
</head>
<body>
<h2>JavaScript <b>this</b> 关键字</h2>
<button onclick="this.style.display='none'">点我后我就消失了</button>
</body>
</html>
~~~
#### 3.15 JSON
* JSON 英文全称 **J**ava**S**cript **O**bject **N**otation
* JSON 是一种轻量级的数据交换格式。
* JSON是独立的语言 **\***
* JSON 易于理解。
~~~
{"sites":[
{"name":"Runoob", "url":"www.runoob.com"},
{"name":"Google", "url":"www.google.com"},
{"name":"Taobao", "url":"www.taobao.com"}
]}
~~~
##### JSON 对象
JSON 对象保存在大括号内。
就像在 JavaScript 中, 对象可以保存多个 键/值 对:
~~~
{"name":"Runoob", "url":"www.baidu.com"}
~~~
##### javascript:void(0)
我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢?
javascript:void(0) 中最关键的是 **void** 关键字, **void** 是 JavaScript 中非常重要的关键字,该操作符指定要计算一个表达式但是不返回值。
下面的函数(方法)没有return(没有返回值)。
~~~
function getValue(){
var a,b,c;
a = void ( b = 5, c = 7 );
document.write('a = ' + a + ' b = ' + b +' c = ' + c );
}
~~~
#### 3.16 异步
异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。
在我们学习的传统单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。而异步的概念则是不保证同步的概念,也就是说,一个异步过程的执行将不再与原有的序列有顺序关系。
简单来理解就是:同步按你的代码顺序执行,异步不按照代码顺序执行,异步的执行效率更高。
以上是关于异步的概念的解释,接下来我们通俗地解释一下异步:异步就是从主线程发射一个子线程来完成任务。
![](https://www.runoob.com/wp-content/uploads/2020/07/async-sync.png)
##### 异步 AJAX
Ajax 的核心是 XMLHttpRequest 对象。
除了 setTimeout 函数以外,异步回调广泛应用于 AJAX 编程。
~~~
var xhr = new XMLHttpRequest();
xhr.onload = function () {
// 输出接收到的文字数据
document.getElementById("demo").innerHTML=xhr.responseText;
}
xhr.onerror = function () {
document.getElementById("demo").innerHTML="请求出错";
}
// 发送异步 GET 请求
xhr.open("GET", "https://www.abc.com/try/ajax/ajax_info.txt", true);
xhr.send();
~~~
AJAX - 向服务器发送请求
如需向服务器发送请求,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:
~~~
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
~~~
| 方法 | 描述 |
| --- | --- |
| open(*method*, *url*, *async*) | 规定请求的类型*method*:请求的类型:GET 还是 POST*url*:服务器(文件)位置*async*:true(异步)或 false(同步) |
| send() | 向服务器发送请求(用于 GET) |
| send(*string*) | 向服务器发送请求(用于 POST) |
AJAX - 服务器响应
onreadystatechange 属性
readyState 属性存留 XMLHttpRequest 的状态。
onreadystatechange 属性定义当 readyState 发生变化时执行的函数。
status 属性和 statusText 属性存有 XMLHttpRequest 对象的状态。
| 属性 | 描述 |
| --- | --- |
| onreadystatechange | 定义了当 readyState 属性发生改变时所调用的函数。 |
| readyState | 保存了 XMLHttpRequest 的状态。0: 请求未初始化1: 服务器连接已建立2: 请求已接收3: 正在处理请求4: 请求已完成且响应已就绪 |
| status | 200: "OK"403: "Forbidden"404: "Page not found" |
| statusText | 返回状态文本(例如 "OK" 或 "Not Found") |
每当 readyState 发生变化时就会调用 onreadystatechange 函数。
当 readyState 为 4,status 为 200 时,响应就绪:
~~~
function loadDoc() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML =
this.responseText;
}
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();
}
~~~
服务器响应属性
| 属性 | 描述 |
| --- | --- |
| responseText | 获取字符串形式的响应数据 |
| responseXML | 获取 XML 数据形式的响应数据 |
服务器响应方法
| 方法 | 描述 |
| --- | --- |
| getResponseHeader() | 从服务器返回特定的头部信息 |
| getAllResponseHeaders() | 从服务器返回所有头部信息 |