第一部分
1.1. Web API介绍
1.1.1 API的概念
1.1.2 Web API的概念
1.1.3 API 和 Web API 总结
1.2. DOM 介绍
1.2.1 什么是DOM
1.2.2. DOM树
1.3. 获取元素
1.3.1. 根据ID获取
1.3.2. 根据标签名获取元素
1.3.3. H5新增获取元素方式
1.3.4 获取特殊元素(body,html)
1.4. 事件基础
1.4.1. 事件概述
1.4.2. 事件三要素
1.4.3. 执行事件的步骤
1.4.4. 常见的鼠标事件
1.4.5. 分析事件三要素
1.5. 操作元素
1.5.1. 改变元素内容(获取或设置)
1.5.2. 常用元素的属性操作
1.5.3. 案例:分时问候
1.5.4. 表单元素的属性操作
1.5.5. 案例:仿京东显示密码
1.5.6. 样式属性操作方式
1.6. 今日总结第二部分
2.1. 排他操作
2.1.1 排他思想
2.2 案例:百度换肤
2.3 案例:表格隔行变色
2.4 案例:全选
2.5. 自定义属性操作
2.5.1 获取属性值
2.5.2. 设置属性值
2.5.3. 移出属性
2.5.4. 案例:tab栏
2.5.5. H5自定义属性
2.6. 节点操作
2.6.1. 节点概述
2.6.2. 节点层级
2.6.3. 父级节点
2.6.4. 子节点
2.6.5. 案例:新浪下拉菜单
2.6.6. 兄弟节点
2.6.7. 创建节点
2.6.8. 添加节点
2.6.9. 案例:简单版发布留言
第三部分
3.1. 节点操作
3.1.1 删除节点
3.1.2 案例:删除留言
3.1.3 复制(克隆)节点
3.1.4 案例:动态生成表格
3.1.5 创建元素的三种方式
3.1.6 innerTHML和createElement效率对比
3.2. DOM的核心总结
3.2.1. 创建
3.2.2. 增加
3.2.3. 删
3.2.4. 改
3.2.5. 查
3.2.6. 属性操作
3.2.7. 事件操作(重点)
3.3. 事件高级
3.3.1. 注册事件(2种方式)
3.3.2 事件监听
3.3.3. 删除事件(解绑事件)
3.3.4. DOM事件流
3.3.5. 事件对象
3.3.6 阻止默认行为
3.3.7 阻止事件冒泡
3.3.8 事件委托
3.4. 常用鼠标事件
3.4.1 案例:禁止选中文字和禁止右键菜单
3.4.2 鼠标事件对象
3.4.3 获取鼠标在页面的坐标
3.4.4 案例:跟随鼠标的天使
第四部分
4.1. 常用的键盘事件
4.1.1 键盘事件
4.1.2 键盘事件对象
4.1.3 案例:模拟京东按键输入内容
4.1.4 案例:模拟京东快递单号查询
4.2. BOM
4.2.1. 什么是BOM
4.2.2. BOM的构成
4.2.3. 顶级对象window
4.2.4. window对象的常见事件页面(窗口)加载事件(2种)
4.2.5. 定时器(两种)
案例:5秒后关闭广告停止定时器
案例:倒计时停止定时器
案例:发送短信倒计时
4.2.6. this指向问题
4.2.7. location对象
案例:5分钟自动跳转页面
案例:获取URL参数location对象的常见方法
4.2.8. navigator对象
4.2.9 history对象
4.3. JS执行机制
4.3.1 JS 是单线程
4.3.2 同步任务和异步任务
4.3.3 JS执行机制(事件循环)
4.3.4 代码思考题
第一部分
学习目标:
能够通过ID来获取元素
能够通过标签名来获取元素
能够通过class来获取元素
能够通过选择器来获取元素
能够获取body和html元素
能够给元素注册事件
能够修改元素的内容
能够区分innerText和innerHTML的区别
能够修改像div这类普通元素的属性
能够修改表单元素的属性
能够修改元素的样式属性
1.1. Web API介绍
1.1.1 API的概念
API是一些预先定义的函数。
无需理解其内部工作机制细节,只需直接调用使用即可。
例如,javascript中函数alert(),
1.1.2 Web API的概念
Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM )。
MDN 详细 API : https://developer.mozilla.org/zh-CN/docs/Web/API
1.1.3 API 和 Web API 总结
API 是为我们程序员提供的一个接口,帮助我们实现某种功能,我们会使用就可以了,不必纠结内部如何实现
Web API 主要是针对于浏览器提供的接口,主要针对于浏览器做交互效果。
Web API 一般都有输入和输出(函数的传参和返回值),Web API 很多都是方法(函数)
学习 Web API 可以结合前面学习内置对象方法的思路学习
1.2. DOM 介绍
1.2.1 什么是DOM
文档对象模型,DOM是W3C组织制定的一套处理 html和xml文档的规范,所有的浏览器都遵循了这套标准。
1.2.2. DOM树
DOM树 又称为文档树模型,把文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面。
文档document:一个页面就是一个文档
节点node:网页中的所有内容都是节点(标签、属性、文本、注释等)
标签节点element:网页中的所有标签,通常称为元素节点/元素
-
1.3. 获取元素
1.3.1. 根据ID获取
语法:document.getElementById(id)
作用:根据ID获取元素对象
参数:id值,区分大小写的字符串
返回值:元素对象 或 null
案例代码
2019-9-9
1.3.2. 根据标签名获取元素
语法:document.getElementsByTagName('标签名') 或者 element.getElementsByTagName('标签名')
作用:根据标签名获取元素对象
参数:标签名
返回值:元素对象集合(伪数组,数组元素是元素对象)
案例代码
- 知否知否,应是等你好久11
- 知否知否,应是等你好久22
- 知否知否,应是等你好久33
- 知否知否,应是等你好久44
- 知否知否,应是等你好久55
注意:getElementsByTagName()获取到是动态集合,即:当页面增加了标签,这个集合中也就增加了元素。
1.3.3. H5新增获取元素方式
案例代码
盒子1
盒子2
1.3.4 获取特殊元素(body,html)
1.4. 事件基础
1.4.1. 事件概述
事件是可以被 JavaScript 侦测到的行为。
简单理解: 触发--- 响应机制。
网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,然后去执行某些操作。
1.4.2. 事件三要素
- 事件源(谁):触发事件的元素
- 事件类型(什么事件): 例如 click 点击事件
- 事件处理程序(做啥):事件触发后要执行的代码(函数形式),事件处理函数
案例代码
1.4.3. 执行事件的步骤
案例代码
123
1.4.4. 常见的鼠标事件
1.4.5. 分析事件三要素
下拉菜单三要素
关闭广告三要素
1.5. 操作元素
JavaScript的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容、属性等。(注意:这些操作都是通过元素对象的属性实现的)
1.5.1. 改变元素内容(获取或设置)
- element.innerText
从起始位置到终止位置的内容,但它去除html 标签,同时空格和换行也会去掉
- element.innerHTML
起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行
1、innerText改变元素内容
某个时间
1123
2、innerText和innerHTML的区别
- 获取内容时的区别:
innerText会去除空格和换行,而innerHTML会保留空格和换行
- 设置内容时的区别:
innerText不会识别html,而innerHTML会识别
案例代码
我是文字
123
1.5.2. 常用元素的属性操作
获取属性的值
元素对象.属性名
设置属性的值
元素对象.属性名 = 值
案例代码
1.5.3. 案例:分时问候
1.5.4. 表单元素的属性操作
表单属性:type value checked selected disabled
获取属性的值
元素对象.属性名
设置属性的值
元素对象.属性名 = 值
表单元素中有一些属性如:disabled、checked、selected,元素对象的这些属性的值是布尔型。
案例代码
1.5.5. 案例:仿京东显示密码
1.5.6. 样式属性操作
我们可以通过 JS 修改元素的大小、颜色、位置等样式。
常用方式:
1、行内样式操作:element.style
2、类名样式操作:element.className
方式1:通过操作style属性
元素对象的style属性也是一个对象!
元素对象.style.样式属性 = 值;
注意:样式属性名用驼峰命名法,如fontSize backgroundColor; 该方式修改后css权重比较高
get start
案例:淘宝点击关闭二维码
案例:循环精灵图背景
案例:显示隐藏文本框内容
方式2:通过操作className属性
元素对象.className = 值;
因为class是关键字,所有使用className。
案例代码
文本
案例:密码框格式提示错误信息
要求输入 6-16位
第二部分
学习目标:
能够说出排他操作的一般实现步骤
能够使用html5中的dataset方式操作自定义属性
能够根据提示完成百度换肤的案例
能够根据提示完成全选案例
能够根据提示完成tab栏切换案例
能够区分元素节点、文本节点、属性节点
能够获取指定元素的父元素
能够获取指定元素的所有子元素
能够说出childNodes和children的区别
能够使用createElement创建页面元素
2.1. 排他操作
2.1.1 排他思想
如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
所有元素全部清除样式(干掉其他人)
给当前元素设置样式 (留下我自己)
注意顺序不能颠倒,首先干掉其他人,再设置自己
2.2 案例:百度换肤
2.3 案例:表格隔行变色
2.4 案例:全选
2.5. 自定义属性操作
2.5.1 获取属性值
2.5.2. 设置属性值
// 2. 设置元素属性值
// (1) element.属性= '值'
div.id = 'test';
div.className = 'navs';
// (2) element.setAttribute('属性', '值'); 主要针对于自定义属性
div.setAttribute('index', 2);
div.setAttribute('class', 'footer'); // class 特殊 这里面写的就是
2.5.3. 移出属性
element.removeAttribute('属性')
// class 不是className
// 3 移除属性 removeAttribute(属性)
div.removeAttribute('index');
2.5.4. 案例:tab栏
2.5.5. H5自定义属性
自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
自定义属性获取是通过getAttribute(‘属性’) 获取。
但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
H5给我们新增了自定义属性:
2.6. 节点操作
2.6.1. 节点概述
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。
一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
2.6.2. 节点层级
利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
2.6.3. 父级节点
×
2.6.4. 子节点
所有子节点
子元素节点
- 我是li
- 我是li
- 我是li
- 我是li
第1个子节点
最后1个子节点
第1个子元素节点
最后1个子元素节点
实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢?
- 我是li1
- 我是li2
- 我是li3
- 我是li4
- 我是li5
2.6.5. 案例:新浪下拉菜单
2.6.6. 兄弟节点
下一个兄弟节点
上一个兄弟节点
我是div
我是span
下一个兄弟元素节点(有兼容性问题)
上一个兄弟元素节点(有兼容性问题)
function getNextElementSibling(element) {
var el = element;
while (el = el.nextSibling) {
if (el.nodeType === 1) {
return el;
}
}
return null;
}
2.6.7. 创建节点
2.6.8. 添加节点
- 123
2.6.9. 案例:简单版发布留言
第三部分
学习目标:
能够使用removeChild()方法删除节点
能够完成动态生成表格案例
能够使用传统方式和监听方式给元素注册事件
能够说出事件流执行的三个阶段
能够在事件处理函数中获取事件对象
能够使用事件对象取消默认行为
能够使用事件对象阻止事件冒泡
能够使用事件对象获取鼠标的位置
能够完成跟随鼠标的天使案例
3.1. 节点操作
3.1.1 删除节点
node.removeChild() 方法从 node节点中删除一个子节点,返回删除的节点。
- 熊大
- 熊二
- 光头强
3.1.2 案例:删除留言
3.1.3 复制(克隆)节点
- 1111
- 2
- 3
3.1.4 案例:动态生成表格
3.1.5 创建元素的三种方式
3.1.6 innerTHML和createElement效率对比
innerHTML字符串拼接方式(效率低)
createElement方式(效率一般)
innerHTML数组方式(效率高)
3.2. DOM的核心总结
关于dom操作,我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。
3.2.1. 创建
3.2.2. 增加
3.2.3. 删
3.2.4. 改
3.2.5. 查
3.2.6. 属性操作
3.2.7. 事件操作(重点)
给元素注册事件,采取 事件源.事件类型 = 事件处理程序
3.3. 事件高级
3.3.1. 注册事件(2种方式)
3.3.2 事件监听
-
addEventListener()(IE9以后支持)
-
attacheEvent()(IE678支持)
-
事件监听兼容性解决方案
封装一个函数,函数中判断浏览器的类型:
3.3.3. 删除事件(解绑事件)
1
2
3
**删除事件兼容性解决方案 **
3.3.4. DOM事件流
比如:我们给页面中的一个div注册了单击事件,当你单击了div时,也就单击了body,单击了html,单击了document。
当时的2大浏览器霸主谁也不服谁! IE 提出从目标元素开始,然后一层一层向外接收事件并响应,也就是冒泡型事件流。 Netscape(网景公司)提出从最外层开始,然后一层一层向内接收事件并响应,也就是捕获型事件流。 江湖纷争,武林盟主也脑壳疼!!! 最终,w3c 采用折中的方式,平息了战火,制定了统一的标准 —--— 先捕获再冒泡。 现代浏览器都遵循了此标准,所以当事件发生时,会经历3个阶段。
DOM 事件流会经历3个阶段:
捕获阶段
当前目标阶段
冒泡阶段
我们向水里面扔一块石头,首先它会有一个下降的过程,这个过程就可以理解为从最顶层向事件发生的最具体元素(目标点)的捕获过程;之后会产生泡泡,会在最低点( 最具体元素)之后漂浮到水面上,这个过程相当于事件冒泡。
事件冒泡
son盒子
事件捕获
son盒子
3.3.5. 事件对象
什么是事件对象
事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象。
比如:
谁绑定了这个事件。
鼠标触发事件的话,会得到鼠标的相关信息,如鼠标位置。
键盘触发事件的话,会得到键盘的相关信息,如按了哪个键。
事件对象的使用
事件触发发生时就会产生事件对象,并且系统会以实参的形式传给事件处理函数。
所以,在事件处理函数中声明1个形参用来接收事件对象。
事件对象的兼容性处理
事件对象本身的获取存在兼容问题:
标准浏览器中是浏览器给方法传递的参数,只需要定义形参 e 就可以获取到。
在 IE6~8 中,浏览器不会给方法传递参数,如果需要的话,需要到 window.event 中获取查找。
只要“||”前面为false, 不管“||”后面是true 还是 false,都返回 “||” 后面的值。
只要“||”前面为true, 不管“||”后面是true 还是 false,都返回 “||” 前面的值。
123
事件对象的属性和方法
e.target 和 this 的区别
this 是事件绑定的元素(绑定这个事件处理函数的元素) 。
e.target 是事件触发的元素。
常情况下terget 和 this是一致的, 但有一种情况不同,那就是在事件冒泡时(父子元素有相同事件,单击子元素,父元素的事件处理函数也会被触发执行), 这时候this指向的是父元素,因为它是绑定事件的元素对象, 而target指向的是子元素,因为他是触发事件的那个具体元素对象。
123
事件冒泡下的e.target和this
- abc
- abc
- abc
3.3.6 阻止默认行为
html中一些标签有默认行为,例如a标签被单击后,默认会进行页面跳转。
百度
3.3.7 阻止事件冒泡
事件冒泡本身的特性,会带来的坏处,也会带来的好处。
son儿子
阻止事件冒泡的兼容性处理
3.3.8 事件委托
事件冒泡本身的特性,会带来的坏处,也会带来的好处。
什么是事件委托
把事情委托给别人,代为处理。
事件委托也称为事件代理,在 jQuery 里面称为事件委派。
说白了就是,不给子元素注册事件,给父元素注册事件,把处理代码在父元素的事件中执行。
事件委托的原理
给父元素注册事件,利用事件冒泡,当子元素的事件触发,会冒泡到父元素,然后去控制相应的子元素。
事件委托的作用
我们只操作了一次 DOM ,提高了程序的性能。
动态新创建的子元素,也拥有事件。
- 知否知否,点我应有弹框在手!
- 知否知否,点我应有弹框在手!
- 知否知否,点我应有弹框在手!
- 知否知否,点我应有弹框在手!
- 知否知否,点我应有弹框在手!
3.4. 常用鼠标事件
3.4.1 案例:禁止选中文字和禁止右键菜单
我是一段不愿意分享的文字
3.4.2 鼠标事件对象
3.4.3 获取鼠标在页面的坐标
3.4.4 案例:跟随鼠标的天使
第四部分
学习目标:
能够说出常用的3-5个键盘事件
能够知道如何获取当前键盘按下的是哪个键
能够知道浏览器的顶级对象window
能够使用window.onload事件
能够使用window.onresize事件
能够说出两种定时器的区别
能够使用location对象的href属性完成页面之间的跳转
能够使用location对象获取url中的参数部分
能够使用history提供的方法实现页面刷新
4.1. 常用的键盘事件
4.1.1 键盘事件
4.1.2 键盘事件对象
使用keyCode属性判断用户按下哪个键
4.1.3 案例:模拟京东按键输入内容
当我们按下 s 键, 光标就定位到搜索框(文本框获得焦点)。
注意:触发获得焦点事件,可以使用 元素对象.focus()
4.1.4 案例:模拟京东快递单号查询
要求:当我们在文本框中输入内容时,文本框上面自动显示大字号的内容。
123
4.2. BOM
4.2.1. 什么是BOM
BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window。
BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。
BOM 缺乏标准,JavaScript 语法的标准化组织是 ECMA,DOM 的标准化组织是 W3C,BOM 最初是Netscape 浏览器标准的一部分。
4.2.2. BOM的构成
BOM 比 DOM 更大,它包含 DOM。
4.2.3. 顶级对象window
4.2.4. window对象的常见事件
页面(窗口)加载事件(2种)
第1种
window.onload 是窗口 (页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS 文件等), 就调用的处理函数。
第2种
1551319620299.png
DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等等。
IE9以上才支持!!!
如果页面的图片很多的话, 从用户访问到onload触发可能需要较长的时间, 交互效果就不能实现,必然影响用户的体验,此时用 DOMContentLoaded 事件比较合适。
调整窗口大小事件
window.onresize 是调整窗口大小加载事件, 当触发时就调用的处理函数。
注意:
只要窗口大小发生像素变化,就会触发这个事件。
我们经常利用这个事件完成响应式布局。 window.innerWidth 当前屏幕的宽度
4.2.5. 定时器(两种)
window 对象给我们提供了 2 个非常好用的方法-定时器。
setTimeout()
setInterval()
setTimeout() 炸弹定时器
开启定时器
普通函数是按照代码顺序直接调用。 简单理解: 回调,就是回头调用的意思。上一件事干完,再回头再调用这个函数。 例如:定时器中的调用函数,事件处理函数,也是回调函数。 以前我们讲的 element.onclick = function(){} 或者 element.addEventListener(“click”, fn); 里面的 函数也是回调函数。
案例:5秒后关闭广告
1551320924828.png
-
.png)
停止定时器
setInterval() 闹钟定时器
开启定时器
案例:倒计时
1
2
3
停止定时器
案例:发送短信倒计时
点击按钮后,该按钮60秒之内不能再次点击,防止重复发送短信。
手机号码:
4.2.6. this指向问题
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,一般情况下this的最终指向的是那个调用它的对象。
现阶段,我们先了解一下几个this指向
全局作用域或者普通函数中this指向全局对象window(注意定时器里面的this指向window)
方法调用中谁调用this指向谁
构造函数中this指向构造函数的实例
4.2.7. location对象
什么是 location 对象
URL
location 对象的属性
案例:5分钟自动跳转页面
案例:获取URL参数
location对象的常见方法
4.2.8. navigator对象
navigator 对象包含有关浏览器的信息,它有很多属性,我们最常用的是 userAgent,该属性可以返回由客户机发送服务器的 user-agent 头部的值。
下面前端代码可以判断用户那个终端打开页面,实现跳转
if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
window.location.href = ""; //手机
} else {
window.location.href = ""; //电脑
}
4.2.9 history对象
window对象给我们提供了一个 history对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的URL。
history对象一般在实际开发中比较少用,但是会在一些 OA 办公系统中见到。
4.3. JS执行机制
以下代码执行的结果是什么?
console.log(1);
setTimeout(function () {
console.log(3);
}, 1000);
console.log(2);
以下代码执行的结果是什么?
console.log(1);
setTimeout(function () {
console.log(3);
}, 0);
console.log(2);
4.3.1 JS 是单线程
单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。
这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。
4.3.2 同步任务和异步任务
单线程导致的问题就是后面的任务等待前面任务完成,如果前面任务很耗时(比如读取网络数据),后面任务不得不一直等待!!
为了解决这个问题,利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程,但是子线程完全受主线程控制。于是,JS 中出现了同步任务和异步任务。
同步
前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。比如做饭的同步做法:我们要烧水煮饭,等水开了(10分钟之后),再去切菜,炒菜。
异步
你在做一件事情时,因为这件事情会花费很长时间,在做这件事的同时,你还可以去处理其他事情。比如做饭的异步做法,我们在烧水的同时,利用这10分钟,去切菜,炒菜。
JS中所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。 同步任务指的是: 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务; 异步任务指的是: 不进入主线程、而进入”任务队列”的任务,当主线程中的任务运行完了,才会从”任务队列”取出异步任务放入主线程执行。
4.3.3 JS执行机制(事件循环)
4.3.4 代码思考题
console.log(1);
document.onclick = function() {
console.log('click');
}
setTimeout(function() {
console.log(3)
}, 3000)
console.log(2);