Web API

原创 2020-01-09 13:02

Javascript中最重要的API-DOM

一、Web APIs

  1. 主要包括:DOM和BOM
  2. 主要功能:主要来实现页面交互功能
  3. API(应用程序编程接口,API就是一些预定义的函数,目)
  4. Web API:是浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM)。

二、认识DOM

(一)、含义

  • DOM:Document Object Mode(文本对象模型)
  • D: 文档-XML文档或者HTML文档
  • O: 对象-document对象的属性和方法
  • M: 模型

    (二)、概念

  • DOM是针对XML(HTML)的基本树的API
  • DOM树:节点(node)的层次。
  • DOM把一个文档表示为一棵家谱树(父、子、兄弟)
  • DOM定义了Node的接口以及许多种节点类型来表示XML节点的多个方面
  • DOM接口:可以改变网页的内容、结构和样式。

三、节点及其类型、

(一)、节点(node):来源于网络理论,代表网络种的一个连接点。网络是节点构成的集合。

  • 文档:一个页面就是一个文档,DOM中使用document表示
  • 元素:页面中的所有标签都是元素,DOM中使用element表示
  • 节点:网页中的所有内容都是节点(标签、属性、文本、注释),DOM中使用node表示

    (二)、节点的三种类型:

    例:

    节点


    p —— 元素节点
    title——属性节点
    节点 ——文本节点

    四、使用DOM

(一)、获取元素

1、根据ID获取:使用getElementByID()方法获取ID元素对象

1
2
3
4
5
6
7
8
9
10
<div id="hello">你好</div>

<script>
// 返回值:element(完整元素对象)
// 参数:字符串类型
var hello = document.getElemnetById('hell');
console.log(hello);
// 打印我们返回的元素对象,更好的查看里面的属性和方法。
console.dir(hello);
</script>

2、通过getElementsByTayName获取某些元素。

//返回值:元素对象的集合,以伪数组的形式存储的.
1
var hellos = document.getElemnetByTagName('div');

3、通过类名获得元素(H5新增方法,不兼容IE6,7,8)

1
2
3
4
5
6
<div class="box"></div>
<div class="box"></div>
<script>
// getElementsByClassName();返回的是元素集合,以伪数组的形式存储
var boxs = document.getElementsByClassName('box');
</script>

4、querySelector 获取元素(H5新增方法,不兼容IE6,7,8)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div class="box">1</div>
<div class="box">2</div>
<div id="box">3</div>
<ul>
<li>首页</li>
<li>产品</li>
</ul>

<script>

// querySelector();他返回的是指定选择器的第一个元素对象
var boxClass = document.querySelector('.box');
var boxID = document.querySelector('#box');
var tagNmae = document.querySelector('li');

</script>

5、querySelectorAll();获取元素,它返回的是指定选择器的元素集合。

1
2
3
4
5
<div class="box">1</div>
<div class="box">2</div>
<script>
var bosAll = dcoument.querySelectorAll('box');
</script>

6、获取body和html元素

1
2
3
4
5
6
<script>
// 获取body元素,返回的是元素的对象
var bodyEle = document.body;
// 获取html元素,
var htmlEle = document.documentElement;
</script>

(二)、事件基础

1、事件的组成:
a.事件源
b.事件类型
c.事件处于里机制
2、事件的语法:
var btn = document.getElementById('btn');
btn.onClick = function(){
    alert('点击有效');
}

(三)、操作元素

1、innerText——修改元素内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 改变元素的内容 需求:当我们点击button按钮时,显示前系统时间-->
<button >显示当前系统时间</button>
<div >某个时间</div>
<script>
// 获取时间源
var btn = document.querySelector('button');
var div = document.querySelector('div');
// 添加监听事件
btn.onclick = function (){
div.innerText = getDate();

}
// 获取当前系统时间
function getDate(){
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'];
var day = date.getDay();
return year+'年'+month+'月'+dates+'日'+arr[day];
}
</script>

2、innerHTML——修改元素内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	<!-- 使用innerText和innerHTML的区别:
1、innerText只能改变标签的文本
2、innerHTML不光能改变标签文本,还能识别HTML标签
-->
<div></div>
<script>
var div = document.querySelector('div');
div.innerHTML = '<strong>标签:<strong/> 标签';
</script>
#### 3、使用innerHTML和innerText读取文件内容
<p>
发货计划就是
<span>合法的还是</span>
</p>
<script>
var p = document.querySelector('p');
// innerText,不识别标签,还去掉了元素内的换行和空格
console.log(p.innerText);
// innerHTML,识别标签,保留元素内的空格和标签
console.log(p.innerHTML);
</script>
#### 4、操作元素属性:

<button id="jsy">江疏影</button>
<button id="wlk">王丽坤</button>
<img src="./imgs/jsy.png" alt="">
<script>
var jsy = document.getElementById('jsy');
var wlk = document.getElementById('wlk');
var img = document.querySelector('img');
jsy.onclick = function(){
img.src ='./imgs/jsy.png';
}
wlk.onclick = function(){
img.src = './imgs/wlk.png';
}
</script>

5、注意操作表单属性:

只有type(类型属性)、value
(值属性)、checked(选择属性)、selected、 disabled(是否被使用)这些属性可以被操作。

6、表格隔行换色:

思路:用到新的鼠标事件,鼠标经过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<style>
table {
width: 800px;
margin: 100px auto;
text-align: center;
border-collapse: collapse;
font-size: 14px;
}

thead tr {
height: 30px;
background-color: skyblue;
}

tbody tr {
height: 30px;
}

tbody td {
border-bottom: 1px solid #d7d7d7;
font-size: 12px;
color: blue;
}

.bg {
background-color: pink;
}
</style>
-------------------------------------------------------------------
<table>
<thead>
<tr>
<th>代码</th>
<th>名称</th>
<th>最新公布净值</th>
<th>累计净值</th>
<th>前单位净值</th>
<th>净值增长率</th>
</tr>
</thead>
<tbody>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农银金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
</tbody>
</table>
-------------------------------------------------------------------
<script>
// 1.获取元素 获取的是 tbody 里面所有的行
var trs = document.querySelector('tbody').querySelectorAll('tr');
// 2. 利用循环绑定注册事件
for (var i = 0; i < trs.length; i++) {
// 3. 鼠标经过事件 onmouseover
trs[i].onmouseover = function() {
// console.log(11);
this.className = 'bg';
}
// 4. 鼠标离开事件 onmouseout
trs[i].onmouseout = function() {
this.className = '';
}
}
</script>

7.排他思想

排他思想就是有一组元素,我们想要某一个实现某种样式,需要用到循环的排他算法:

    <!-- 排他思想 -->
    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
    <button>按钮5</button>
<script>
    // 1.获取所有按钮元素
    var btns= document.getElementsByTagName('button');
    // 2.btns得到的是为数组,里面的每一个元素btns[i]
    for(var i = 0; btns.length;i++){
        btns[i].onclick = function(){
            // 3.先把所有的按钮颜色去掉
            for(var i=0;i<btns.length; i++){
                btns[i].style.backgroundColor = '';
            }
            // 4.然后改变选中的背景颜色
            this.style.backgroundColor = 'pink';
        }
    }
</script>

8.百度换肤案例()

需求:通过点击图片来切换页面背景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<style>
* {
margin: 0;
padding: 0;
}

body {
background: url(imgs/1.jpg) no-repeat center top;
}

li {
list-style: none;
}

.baidu {
overflow: hidden;
margin: 100px auto;
background-color: #fff;
width: 410px;
padding-top: 3px;
}

.baidu li {
float: left;
margin: 0 1px;
cursor: pointer;
}

.baidu img {
width: 100px;
}
</style>
---------------------------------------------------------
<ul class="baidu">
<li><img src="imgs/1.jpg"></li>
<li><img src="imgs/2.jpg"></li>
<li><img src="imgs/3.jpg"></li>
<li><img src="imgs/4.jpg"></li>
</ul>
---------------------------------------------------------
<script>
// 1. 获取元素
var imgs = document.querySelector('.baidu').querySelectorAll('img');
// 2. 利用for循环给每个图片设置点击事件
for(var i = 0; i < imgs.length;i++){
imgs[i].onclick = function(){
// this.src 就是我们点击图片的路径,然后将路径赋给body.backgroundImage
document.body.style.backgroundImage = 'url('+this.src+')';
// 注意:此处赋值需要利用拼接字符串.
}
}
</script>

9.tab栏切换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
	 <style>
* {
margin: 0;
padding: 0;
}

li {
list-style-type: none;
}

.tab {
width: 978px;
margin: 100px auto;
}

.tab_list {
height: 39px;
border: 1px solid #ccc;
background-color: #f1f1f1;
}

.tab_list li {
float: left;
height: 39px;
line-height: 39px;
padding: 0 20px;
text-align: center;
cursor: pointer;
}

.tab_list .current {
background-color: #c81623;
color: #fff;
}

.item_info {
padding: 20px 0 0 20px;
}

.item {
display: none;
height: 300px;
background-color: #c81623;
}
.item:nth-child(2){
background-color: aqua;

}
.item:nth-child(3){
background-color: #393953;
}
.item:nth-child(4){
background-color: #898989;
}
.item:nth-child(5){
background-color: #ff78ff;
}
</style>
----
<div class="tab">
<div class="tab_list">
<ul>
<li class="current">商品介绍</li>
<li>规格与包装</li>
<li>售后保障</li>
<li>商品评价(50000)</li>
<li>手机社区</li>
</ul>
</div>
<div class="tab_con">
<div class="item" style="display: block;">
商品介绍模块内容
</div>
<div class="item">
规格与包装模块内容
</div>
<div class="item">
售后保障模块内容
</div>
<div class="item">
商品评价(50000)模块内容
</div>
<div class="item">
手机社区模块内容
</div>

</div>
</div>
------
<script>
// 获取元素
var tab_list = document.querySelector('.tab_list');
var lis = tab_list.querySelectorAll('li');
var items = document.querySelectorAll('.item');
// for循环绑定点击事件
for (var i = 0; i < lis.length; i++) {
// 开始给5个小li 设置索引号
lis[i].setAttribute('index', i);
lis[i].onclick = function() {
// 1. 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想) 修改类名的方式

// 干掉所有人 其余的li清除 class 这个类
for (var i = 0; i < lis.length; i++) {
lis[i].className = '';
}
// 留下我自己
this.className = 'current';
// 2. 下面的显示内容模块
var index = this.getAttribute('index');
console.log(index);
// 干掉所有人 让其余的item 这些div 隐藏
for (var i = 0; i < items.length; i++) {
items[i].style.display = 'none';
}
// 留下我自己 让对应的item 显示出来
items[index].style.display = 'block';
}
}
</script>

10、自定义属性规范

注意:

  • 自定义属性的目的:是为了保存并使用数据。有些数据可以保存到网页中而不保存到数据库中
  • 自定义属性获取是通过getAttribute(‘属性’)获取。
  • 但是有些自定义属性很容易引起歧义,不容易和内置属性进行区分
  • 自定义属性的规范:
  • 1、H5规定自定义属性data开头做为属性名并且赋值
  • 比如:data-index = “2”

H5新增获取自定义属性方法:

1
2
3
4
5
6
7
8
9
10
11
12
  <div getTime = "20" data-time="12" data-list-name = "andy"></div>
<script>
var div = document.querySelector('div');
var d = div.getAttribute('getTime');
console.log(d);
div.setAttribute('data-time',20);
// H5新增的获取自定义属性的方法
// dataset是一个集合里面存放了所有以data开头的自定义属性
console.log(div.dataset.time);
// data-list-name:必须使用驼峰命名法进行获取
console.log(div.listName);
</script>

(四)、节点操作

一般的节点至少拥有nodeType(节点类型)、nodeName(节点名称)、nodeValue(节点值)这三个基本属性。
1、元素节点 nodeType 为 1
2、属性节点 nodeType 为 2
3、文本节点 nodeType 为 3
在实际开发中,节点操作主要操作是元素节点
利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。

1.父级节点

node.parentNode

2.小案例:

<div class="demo">
    <div class="box">
        <span class="erweima"></span>
    </div>
</div>
<script>
    var erweima = document.querySelector('.erweima');
    // 下面我们要拿到它的父节点(box),就可以使用parentNode来的到
    console.log(erweima.parentNode);
    // 在这里我们需要注意的是他得到的是离他最近的父节点,如果没找到就会返回为 null
</script>

3.子级节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    <ul>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
</ul>
<script>
var ul = document.querySelector('ul');
// 通过childNodes可以获得ul下的所有节点(包括文本节点、元素节点、属性节点)
console.log(ul.childNodes);
</script>
![](javaScript_DOM/zijiedian.png)
从这里我们可以看到通过childNodes获得到的是ul下的所有节点,然而通常我们只需要获得它的所有元素节点,问题来了?解决这个问题我们用children它用来获取子元素节点的。

<ul>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
</ul>
<script>
var ul = document.querySelector('ul');
// children 获取所有子元素节点
console.log(ul.children());
</script>
![](javaScript_DOM/zijiedian1.png)

4.子节点操作获取最后一个和第一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<ol>
<li>我是li-1</li>
<li>我是li-2</li>
<li>我是li-3</li>
<li>我是li-4</li>
</ol>
<script>
var ol = document.querySelector('ol');

// 1、获取第一个节点和最后一个节点
// firstChild 获取第一个节点(不管是文本节点还是元素节点)
console.log(ol.firstChild);
// lastChild 获取最后一个节点
console.log(ol.lastChild);

// 2、获取子元素节点(只兼容IE9以上版本)
// firstElementChild 返回第一个元素节点
console.log(ol.firstElementChild);
// lastElementChild 返回最后一个元素节点
console.log(ol.lastElementChild);

// 3、实际开发的写法 没有兼容性问题
console.log(ol.children[0]);
</script>

5.下拉菜单案例 (案例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
	<style>
* {
margin: 0;
padding: 0;
}

li {
list-style-type: none;
}

a {
text-decoration: none;
font-size: 14px;
}

.nav {
margin: 100px;
}

.nav>li {
position: relative;
float: left;
width: 80px;
height: 41px;
text-align: center;
}

.nav li a {
display: block;
width: 100%;
height: 100%;
line-height: 41px;
color: #333;
}

.nav>li>a:hover {
background-color: #eee;
}

.nav ul {
display: none;
position: absolute;
top: 41px;
left: 0;
width: 100%;
border-left: 1px solid #FECC5B;
border-right: 1px solid #FECC5B;
}

.nav ul li {
border-bottom: 1px solid #FECC5B;
}

.nav ul li a:hover {
background-color: #FFF5DA;
}
</style>
<ul class="nav">
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
</ul>
<script>
// 1. 获取元素
var nav = document.querySelector('.nav');
var lis = nav.children; // 得到4个小li
// 2.循环注册事件
for (var i = 0; i < lis.length; i++) {
lis[i].onmouseover = function() {
this.children[1].style.display = 'block';
}
lis[i].onmouseout = function() {
this.children[1].style.display = 'none';
}
}
</script>

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×