1. 简介
1.1 Web APIs 和 JS 基础关联性
1.2 API 和 Web API
API(应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而无需访问源码或理解内部工作机制的细节。
Web API 是浏览器提供的一套操作浏览器功能和页面元素的API(BOM 和 DOM)
2. DOM
2.1 简介
2.1.1 定义
文档对象模型(DOM)是 W3C 组织推荐的处理可扩展标记语言(HTML 或 XML)的标准编程接口
2.1.2 DOM树
文档:一个页面就是一个文档,DOM 中使用 document 表示
元素: 页面中的所有标签都是元素,DOM 中使用 element 表示
节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM 中使用 node 表示
DOM把以上所有内容都看作是对象
2.2 获取元素
2.2.1 根据 ID 获取
使用 getElementById() 获取带有 ID 的元素对象
(1)因为文档页面从上向下加载,所以得先有标签,script 写到标签下面
(2)返回的是一个元素对象,找不到则返回 null
(3)console.dir() 打印返回的元素对象
<body>
<div id="time">2020-2-2</div>
<script>
var timer = document.getElementById('time');
console.log(timer);
console.log(typeof timer); // object
console.dir(timer);
</script>
</body>
2.2.2 根据标签名获取
使用 getElementsByTagName() 返回带有指定标签名的对象的集合,以伪数组的形式存储
(1)页面中只有一个这种元素,返回的仍为伪数组的形式
(2)页面中没有这个元素,则返回空的伪数组
<body>
<ul>
<li>aaa</li>
<li>bbb</li>
<li>ccc</li>
</ul>
<script>
var lis = document.getElementsByTagName('li');
console.log(lis);
console.log(lis[1]);
</script>
</body>
(3)可获取某个元素(父元素)内部做所有指定标签名的子元素,但父元素必须为单个对戏,获取时不包括父元素自己
element.getElementsByTagName('标签名');
<body>
<ol>
<li>ddd</li>
<li>ddd</li>
<li>ddd</li>
<li>ddd</li>
</ol>
<script>
var ol = document.getElementsByTagName('ol');
console,log(ol[0].getElementsByTagName('li'));
//不能写ol.getElementsByTagName('li'),因为必须是单个元素,不能说伪数组形式
</script>
</body>
2.2.3 通过 HTML5 新增的方法获取
(1)document.getElementsByClassName('类名'); // 根据类名返回元素对象集合
<body>
<div class="box">盒子</div>
<div class="box">盒子</div>
<script>
var boxs = document.getElementsByClassName('box');
console.log(boxs);
</script>
</body>
(2)document.querySelector('选择器'); // 根据指定选择器返回第一个元素对象
<body>
<div class="box">盒子</div>
<div class="box">盒子</div>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
var firstBox = document.querySelector('.box'); // .为class
console.log(firstBox);
var nav = document.querySelector('#nav'); // #为id
console.log(nav);
var li = document.querySelector('li');
console.log(li);
</script>
</body>
(3)document,querySelectorAll('选择器‘) // 返回指定选择器的所有元素对象集合
<script>
var allBox = document.querySelectorAll('.box');
console.log(allBox);
</script>
2.2.4 特殊元素获取
(1)获取 body 元素
var bodyEle = document.body;
console.log(bodyEle);
console.dir(bodyEle);
(2)获取 html 元素
var htmlEle = document.documentElement;
console.log(htmlEle);
2.3 事件基础
2.3.1 事件概述
事件是可以被 JavaScript 侦测到的行为
2.3.2 事件三要素
(1)事件源:事件被触发的对象
(2)事件类型:如何触发,什么事件,例如,鼠标点击,鼠标经过或键盘按下
(3)事件处理程序:通过函数赋值的方式完成
例子:鼠标点击按钮,弹出警示框
<body>
<button id="btn">aaa</button>
<script>
//事件源
var btn = document.getElementById('btn');
//事件类型, 事件处理程序
btn.onclick = function() {
alert('bbb');
}
</script>
</body>
2.3.3 执行事件的步骤
(1)获取事件源
(2)注册事件(绑定事件)
(3)添加事件处理程序(采用函数赋值形式)
2.4 操作元素
2.4.1 改变元素内容
(1)从初始位置到终止位置的内容,但去除 html 标签,同时空格和换行也会去掉(不可识别html标签,非标准)
element.innerText
例子:点击按钮,div 中的文字发生变化
<body>
<button>显示当前系统时间</button>
<div>某个时间</div>
<script>
//1.获取元素
var btn = document.querySelector('button');
var div = document.querySelector('div');
//2.注册事件
btn.onclick = function() {
div.innerText = '2020-2-2';
}
</script>
</body>
(2)起始位置到终止位置的所有内容,包括 html 标签,同时保留空格和换行(可识别html标签,W3C标准)
element.innerHTML
<body>
<div></div>
<script>
var div = document.querySelector('div');
// innerText 不识别 html 标准
div.innerText = '<strong>aaa</strong>'; // <strong>aaa</strong>
// innerHTML 识别 html 标签
div.innerHTML = '<strong>aaa</strong>'; //aaa(加粗后的)
</script>
</body>
这两个属性都是可读写的,可以获取元素里面的内容
<body>
<p>
文字
<span>123</span>
</p>
<script>
var p = document.querySelector('p');
console.log(p.innerText);
// 文字 123
console.log(p.innerHTML);
// 文字
// <span>123</span>
</script>
</body>
2.4.2 操作元素内容
<body>
<button id="a">a</button>
<button id="w">w</button>
<img src="1.jpg" alt="" title="aw">
<script>
var a = document.getElementById('a');
var w = document.getElementById('w');
var img = document.querySelector('img');
a.onclick = function() {
img.src = '1.jpg';
img.title = 'a';
}
b.onclick = function() {
img.src = '2.jpg';
img.title = 'w';
}
</script>
</body>
2.4.3 表单元素的属性操作
利用 DOM 可以操作如下表单元素的属性:
type, value, checked, selected, disabled
<body>
<button>按钮</button>
<input type="text" value="输入内容">
<script>
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick = function() {
input.value = '被点击了';
// disabled 禁用某个表单,不能再被点击
btn.disabled = true;
}
</script>
</body>
2.4.4 样式属性操作
(1)element.style // 行内样式操作
<body>
<script>
var div = document.querySelector('div');
div.onclick = function() {
this.style.backgroundColor = 'pink';
}
</script>
</body>
(2)element.className // 类名样式操作
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.change {
background-color: pink;
color: #fff;
font-size: 25px;
margin-top: 100px;
}
</style>
</head>
<body>
<div>文字</div>
<script>
var test = document.querySelector('div');
test.onclick = function() {
this.className = 'change'; // 直接覆盖原先的类
}
</script>
</body>
2.4.5 自定义属性的操作
2.4.5.1 获取属性值
(1)element.属性
获得内置属性值,即元素本身自带的属性
<body>
<div id="demo"></div>
<script>
var div = document.querySelector('div');
console.log(div.id); //demo
</script>
</body>
(2)element.getAttribute('属性’)
主要获得自定义的属性(标准)
<body>
<div id="demo" index = "1"></div>
<script>
var div = document.querySelector('div');
console.log(div.getAttribute('index')); // 1
</script>
</body>
2.4.5.2 设置属性值
(1)element.属性 = '值'
设置内置属性值
div.id = 'test';
(2)element.setAttribute('属性’, '值');
主要针对于自定义属性
div.setAttribute('index', 2);
2.4.5.3 移除属性
(1)element.removeAttribute('属性’);
div.removeAttribute('index');
2.4.6 H5 自定义属性
2.4.6.1 设置 H5 自定义属性
H5 规定自定义属性 data- 开头作为属性名并赋值
<div data-index="1"></div>
2.4.6.2 获取 H5 自定义属性
(1)兼容性获取 element.getAttribute('data-index');
(2)H5 新增 element.dataset.index 或者 element.dataset['index'];
dataset 是一个存放了所有以 data- 开头的自定义属性的集合
<body>
<div data-index="1" data-time="2"></div>
<script>
var div = document.querySelector('div');
console.log(div.dataset);
// DOMStringMap
// index: "1"
// time: "2"
console.log(div.dataset.index); //1
console.log(div.dataset.time); //2
console.log(div.dataset['time']); //2
</script>
</body>
特殊:
<body>
<div data-index-num="3"></div>
<script>
var div = document.querySelector('div');
console.log(div.getAttribute('data-index-num'));
// 注意去掉-,采用驼峰命名法
console.log(div.dataset.indexNum); // N记得大写
console.log(div.dataset['indexNum']); // N记得大写
</script>
</body>
2.5 节点操作
2.5.1 节点概述
节点至少拥有 nodeType(节点类型)、nodeName(节点名称)和 nodeValue(节点值)这三个基本属性。
(1)nodeType:
- 元素节点:1
- 属性节点:2
- 文本节点:3(文本节点包含文字、空格、换行等)
2.5.2 节点层级
常见为父子兄关系
2.5.2.1 父级节点
element.parentNode; // 得离元素最近的父节点,无则返回null
<body>
<div class="box">
<span class="ma">x</span>
</div>
<script>
var ma = document.querySelector('.ma');
console.log(ma.parentNode); // 取到box
</script>
</body>
2.5.2.2 子节点
childNodes 所有的子节点包含元素节点、文本节点(包括换行)等
(1)parentNode.childNodes(标准)
返回值包含所有子节点,找不到为 null,不推荐使用
(2)parentNode.children(非标准)
只返回所有的子元素节点,找不到为 null,推荐使用
(3)parentNode.firstChild
返回第一个子节点,找不到为 null,同样包含所有子节点
(4)parentNode.lastChild
返回最后一个子节点,找不到为 null,同样包含所有子节点
(5)parentNode.firstElementChild(IE9以上支持)
返回第一个子元素节点,找不到为 null
(6)parentNode.lastElementChild(IE9以上支持)
返回最后一个子元素节点,找不到为 null
(7)实际使用
parentNode.children[0]; // 第一个子元素节点
parentNode.children[parentNode.children.length - 1]; // 最后一个子元素节点
<body>
<ul>
<li>aaa1</li>
<li>aaa2</li>
<li>aaa3</li>
<li>aaa4</li>
</ul>
<script>
var ul = document.querySelector('ul');
console.log(ul.childNodes);
// NodeList(9) [text, li, text, li, text, li, text, li, text]
console.log(ul.children);
// HTMLCollection(4) [li, li, li, li]
console.log(ul.firstChild); // #text
console.log(ul.firstElementChild);
console.log(ul.lastChild); // #text
console.log(ul.lastElementChild);
console.log(ul.children[0]);
console.log(ul.children[ul.children.length - 1]);
</script>
</body>
2.5.2.3 兄弟节点
(1)node.nextSibling
返回当前元素的下一个兄弟节点,找不到为 null,同样包含所有子节点
(2)node.previousSibling
返回当前元素的上一个兄弟节点,找不到为 null,同样包含所有子节点
(3)node.nextElementSibling(IE9以上支持)
返回当前元素的下一个兄弟元素节点,找不到为 null
(4)node.previousElementSibling(IE9以上支持)
返回当前元素的上一个兄弟元素节点,找不到为 null
<body>
<div>div</div>
<span>span</span>
<script>
var div = document.querySelector('div');
console.log(div.nextSibling); // #text
console.log(div.previousSibling); // #text
console.log(div.nextElementSibling);
console.log(div.previousElementSibling); // null
</script>
</body>
2.5.2.4 创建节点
document.createElement('tagName')
2.5.2.5 添加节点
(1)node.appendChild(child)
将一个节点添加到指定父节点的子节点列表末尾
<body>
<ul></ul>
<script>
var li = document.createElement('li');
var ul = document.querySelector('ul');
ul.appendChild(li);
</script>
</body>
(2)node.insertBefore(child, 指定元素)
将一个节点添加到父节点的指定子节点前面
<body>
<ul></ul>
<script>
var ul = document.querySelector('ul');
var lili = document.createElement('li');
ul.insertBefore(lili, ul.children[0]);
</script>
</body>
2.5.2.6 删除节点
node.removeChild(child)
删除一个子节点,并返回删除的节点
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
var ul = document.querySelector('ul');
ul.removeChild(ul.children[0]);
</script>
</body>