Web APIs和JS基础关联性
1. JS的组成
2. JS基础阶段以及Web APIs阶段
- JS基础阶段
- Web APIs阶段
API和Web API
1. API
- API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
- API 是给程序员提供的一种工具,以便能更轻松的实现想要完成的功能。
- 充电接口就是一个API
2. Web API
- Web API 是浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM)。
- MDN详细API:APIhttps://developer.mozilla.org/zh-CN/docs/Web/API
3. API和Web API总结
- API 是为我们程序员提供的一个接口,帮助我们实现某种功能,我们会使用就可以了,不必纠结内部如何实现
- Web API 主要是针对于浏览器提供的接口,主要针对于浏览器做交互效果。
- Web API 一般都有输入和输出(函数的传参和返回值),Web API 很多都是方法(函数)
- 学习Web API 可以结合前面学习内置对象方法的思路学习
DOM简介
1. 什么是DOM
- 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。
- W3C 已经定义了一系列的DOM 接口,通过这些DOM 接口可以改变网页的内容、结构和样式。
2. DOM树
- 文档:一个页面就是一个文档,DOM 中使用document 表示
- 元素:页面中的所有标签都是元素,DOM 中使用element 表示
- 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM 中使用node 表示
- DOM 把以上内容都看做是对象
获取元素
1. 如何获取页面元素
- DOM在我们实际开发中主要用来操作元素。
- 获取页面中的元素可以使用以下几种方式:
- 根据ID 获取
- 根据标签名获取
- 通过HTML5 新增的方法获取
- 特殊元素获取
2. 根据ID获取
- 使用getElementById() 方法可以获取带有ID 的元素对象。
document.getElementById('id');
- 使用console.dir() 可以打印我们获取的元素对象,更好的查看对象里面的属性和方法。
3. 根据标签名获取
- 使用getElementsByTagName() 方法可以返回带有指定标签名的对象的集合。
document.getElementsByTagName('标签名');
- ⚠️:
- 因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历。
- 得到元素对象是动态的
4. 通过HTML5新增的方法获取
1. document.getElementsByClassName('类名');// 根据类名返回元素对象集合
2. document.querySelector('选择器'); // 根据指定选择器返回第一个元素对象
3. document.querySelectorAll('选择器'); // 根据指定选择器返回
- ⚠️:querySelector和querySelectorAll里面的选择器需要加符号,比如:document.querySelector('#nav');
5. 获取特殊元素(body,html)
- 获取body元素
1. document.body // 返回body元素对象
- 获取html元素
1. document.documentElement // 返回html元素对象
事件基础
1. 事件概述
- JavaScript 使我们有能力创建动态页面,而事件是可以被JavaScript 侦测到的行为。
- 网页中的每个元素都可以产生某些可以触发JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。
2. 事件三要素
- 事件源(谁)
- 事件类型(什么事件)
- 事件处理程序(做啥)
3. 执行事件的步骤
- 获取事件源
- 注册事件(绑定事件)
- 添加事件处理程序(采取函数赋值形式)
4. 常见的鼠标事件
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfoucs | 获得鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
5. 分析事件三要素
- 下拉菜单三要素
- 关闭广告三要素
操作元素
JavaScript 的DOM 操作可以改变网页内容、结构和样式,我们可以利用DOM 操作元素来改变元素里面的内容、属性等。注意以下都是属性
1. 改变元素内容
element.innerText
- 从起始位置到终止位置的内容, 但它去除html标签,同时空格和换行也会去掉
element.innerHTML
- 起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行
2. 常用元素的属性操作
1. innerText、innerHTML 改变元素内容
2. src、href
3. id、alt、title
3. 表单元素的属性操作
- 利用DOM 可以操作如下表单元素的属性:
type、value、checked、selected、disabled
4. 样式属性操作
- 我们可以通过JS 修改元素的大小、颜色、位置等样式。
1. element.style 行内样式操作
2. element.className 类名样式操作
- ⚠️:
- JS里面的样式采取驼峰命名法比如fontSize、backgroundColor
- JS修改style样式操作,产生的是行内样式,CSS权重比较高
- 如果样式修改较多,可以采取操作类名方式更改元素样式。
- class因为是个保留字,因此使用className来操作元素类名属性
- className会直接更改元素的类名,会覆盖原先的类名。
5. 排他思想
- 如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式(留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
6. 自定义属性的操作
- 获取属性值
- element.属性 获取属性值。
- element.getAttribute('属性');
- 区别:
- element.属性 获取内置属性值(元素本身自带的属性)
- element.getAttribute(‘属性’); 主要获得自定义的属性(标准)我们程序员自定义的属性
- 设置属性值
- element.属性 = ‘值’ 设置内置属性值。
- element.setAttribute('属性','值');
- 区别:
- element.属性 设置内置属性值
- element.setAttribute(‘属性’);主要设置自定义的属性(标准)
- 移除属性
- element.removeAttribute('属性');
7. H5自定义属性
- 自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
- 自定义属性获取是通过getAttribute(‘属性’)获取。
- 但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
- H5给我们新增了自定义属性:
- 设置H5自定义属性:H5规定自定义属性data-开头做为属性名并且赋值。
- 比如<divdata-index=“1”></div>
- 获取H5自定义属性:兼容性获取 element.getAttribute(‘data-index’); H5新增element.dataset.index 或者element.dataset [‘index’] ie 11才开始支持
- 设置H5自定义属性:H5规定自定义属性data-开头做为属性名并且赋值。
节点操作
1. 为什么学节点操作
获取元素通常使用两种方式:
- 利用DOM 提供的方法获取元素
- document.getElementById()
- document.getElementsByTagName()
- document.querySelector 等
- 逻辑性不强、繁琐
- 利用节点层级关系获取元素
- 利用父子兄节点关系获取元素
- 逻辑性强,但是兼容性稍差
2. 节点概述
- 网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用node 来表示。
- HTML DOM树中的所有节点均可通过JavaScript 进行访问,所有HTML 元素(节点)均可被修改,也可以创建或删除。
- 一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
- 元素节点nodeType 为1
- 属性节点 nodeType 为2
- 文本节点 nodeType 为3(文本节点包含文字、空格、换行等)
3. 节点层级
- 利用DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
- 父级节点
node.parentNode
- parentNode 属性可返回某节点的父节点,注意是最近的一个父节点
- 如果指定的节点没有父节点则返回null
- 子节点
1. parentNode.childNodes (标准)
- parentNode.childNodes返回包含指定节点的子节点的集合,该集合为即时更新的集合。
- ⚠️:返回值里面包含了所有的子节点,包括元素节点,文本节点等。
- 如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes
var ul = document. querySelector(‘ul’);
for(var i = 0; i < ul.childNodes.length;i++) {
if (ul.childNodes[i].nodeType == 1) {
// ul.childNodes[i]是元素节点
console.log(ul.childNodes[i]);
}
}
2. parentNode.children (非标准)
- parentNode.children是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回(这个是我们重点掌握的)。
- 虽然children 是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用
3. parentNode.firstChild
- firstChild 返回第一个子节点,找不到则返回null。同样,也是包含所有的节点。
4. parentNode.lastChild
- lastChild 返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点。
5. parentNode.firstElementChild
- firstElementChild返回第一个子元素节点,找不到则返回null。
6. parentNode.lastElementChild
- lastElementChild返回最后一个子元素节点,找不到则返回null。
- ⚠️:这两个方法有兼容性问题,IE9以上才支持。
- 兄弟节点
1. node.nextSibling
- nextSibling返回当前元素的下一个兄弟元素节点,找不到则返回null。同样,也是包含所有的节点。
2. node.previousSibling
- previousSibling返回当前元素上一个兄弟元素节点,找不到则返回null。同样,也是包含所有的节点。
3. node.nextElementSibling
- nextElementSibling返回当前元素下一个兄弟元素节点,找不到则返回null。
4. node.previousElementSibling
- previousElementSibling返回当前元素上一个兄弟节点,找不到则返回null。
- ⚠️:这两个方法有兼容性问题,IE9以上才支持。
4. 创建节点
document.createElement('tagName')
- document.createElement()方法创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。
5. 添加节点
1. node.appendChild(child)
- node.appendChild()方法将一个节点添加到指定父节点的子节点列表末尾。类似于CSS里面的after伪元素。
2. node.insertBefore(child, 指定元素)
- node.insertBefore()方法将一个节点添加到父节点的指定子节点前面。类似于CSS里面的before伪元素。
6. 删除节点
node.removeCHild(child)
- node.removeChild()方法从DOM中删除一个子节点,返回删除的节点。
7. 复制节点
node.cloneNode()
- node.cloneNode()方法返回调用该方法的节点的一个副本。
- ⚠️:
- 如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
- 如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点。
8. 替换节点
parentNode.replaceCHILD(newChild, oldChild);
- 用指定的节点替换当前节点的一个子节点,并返回被替换掉的节点。
9. 创建元素总结
- document.write()
- innerHTML
- document.createElement()
- 区别:
- ocument.write是直接将内容写入页面的内容流,会导致页面全部重绘
- innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘
- innerHTML复制节点的时候,不会复制原先节点的事件,会存在内存泄露问题
- 如果页面创建元素很多,建议使用innerHTML因其效率更高(不要拼接字符串,采取数组形式拼接)
- 如果页面创建元素较少,建议使用createElement()
- 总结:不同浏览器下,innerHTML效率要比creatElement高