---
tags: API,DOM,第二章
---
# 串接API之DOM第二章
## getAttribute
element.屬性 獲取屬性值
獲取內置屬性
element.getAttribute('屬性')
獲取自定義屬性
...
設置屬性值
方法一
element.屬性='值' 設置內置屬性
方法二
element.setAttribute('屬性','值')
...
移除屬性
element.removeAttribute('屬性')
```
<body>
<div id="demo" index="1"></div>
<script>
var div = document.querySelector('div');
console.log(div); // 結果像是把後面的程式碼執行完才來執行這一行
console.log(div.id); // demo
console.log(div.getAttribute('id')); // demo
console.log(div.getAttribute('index')); // 1
div.id = 'text';
div.className = 'nav'; // 注意是className
console.log(div.id); // text
console.log(div.className); // nav
div.setAttribute('index', '2');
div.setAttribute('class', 'footer'); // class比較特殊
div.removeAttribute('index');
</script>
</body>
```
## tab欄切換製作
:::danger
未完成
:::
```
<!DOCTYPE html>
<html lang="en">
<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>
.tab_list li {
float: left;
height: 39px;
line-height: 39px;
padding: 0 20px;
text-align: center;
cursor: pointer;
}
.tab_list .current {
background-color: red;
color: #fff;
}
.item_info {
padding: 20px 0 0 20px;
}
</style>
</head>
<body>
<div class="tab">
<div class="tab_list">
<ul>
<li class="current">商品介紹</li>
<li>規格與包裝</li>
<li>售後保障</li>
<li>商品評價</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">商品評價模塊內容</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 (var i = 0; i < lis.length; i++) {
lis[i].setAttribute('index', i);
lis[i].onclick = function () {
for (var i = 0; i < lis.length; i++) {
lis[i].className = '';
}
this.className = 'current';
var index = this.getAttribute('index');
console.log(index);
for (var i = 0; i < items.length; i++) {
items[i].style.display = 'none';
}
items[index].style.display = 'block';
};
}
</script>
</body>
</html>
```
## H5自定義屬性
data-開頭
element.setAttribute('data-index','2')
兼容性獲取element.getAttribute('data-index')
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<div getTime="20" data-index="2" data-list-name="andy"></div>
<script>
var div = document.querySelector('div');
// console.log(div.getTime); // 錯誤寫法
console.log(div.getAttribute('getTime'));
div.setAttribute('data-time', '20');
console.log(div.getAttribute('data-index'));
console.log(div.getAttribute('data-list-name')); // 看下面的注意
// H5新增
console.log(div.dataset);
console.log(div.dataset.index);
console.log(div.dataset['index']);
console.log(div.dataset.listName);
console.log(div.dataset['listName']); // 注意
</script>
</body>
</html>
```
## 節點
利用DOM獲取元素
document.getElementById()
document.getElementsByTagName()
document.querySelector()
邏輯不強、繁瑣
...
利用節點獲取元素
利用父子兄節點關係
邏輯性強、兼容性稍差
nodeName節點名稱
nodeType節點類型
nodeValue節點值
元素節點nodeType=1
屬性節點nodeType=2
文本節點nodeType=3(包含文字、空格、換行)
實際開發幾乎只用元素節點nodeType=1
...
Element.parentNode
Element.childNodes
Element.childNodes[0]
Element.children
Element.children[0]
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<div>我是div</div>
<span>我是span</span>
<ul>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
</ul>
<div class="demo">
<div class="box">
<span class="erweima">x</span>
</div>
</div>
<script>
var erweima = document.querySelector('.erweima');
var box = document.querySelector('.box');
console.dir(box);
// 得到離元素最近的父節點
// 如果找不到就返回null
console.log(erweima.parentNode);
// 傳統獲取方式
var ul = document.querySelector('ul');
var lis = ul.querySelectorAll('li');
// 子節點 childNodes 所有子節點 包含 元素節點 文本節點
console.log(ul.childNodes);
console.log(ul.childNodes[0].nodeType); // 3
console.log(ul.childNodes[1].nodeType); // 1
// children(非標準)獲取所有元素節點 開發常用
console.log(ul.children);
</script>
</body>
</html>
```
Element.firstChild
Element.lastChild
Element.firstElementChild
Element.lastElementChild
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<ol>
<li>我是li1</li>
<li>我是li2</li>
<li>我是li3</li>
<li>我是li4</li>
</ol>
<script>
var ol = document.querySelector('ol');
// firstChild 第一個子節點 不管文本節點還是元素節點
console.log(ol.firstChild);
console.log(ol.lastChild);
// firstElementChild 第一個元素節點
console.log(ol.firstElementChild);
console.log(ol.lastElementChild);
</script>
</body>
</html>
```
## 新浪下拉菜單
:::danger
未完成
:::
```
<!DOCTYPE html>
<html lang="en">
<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>
.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>
</head>
<body>
<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>
var nav = document.querySelector('nav');
var lis = nav.children; // 得到4個小li
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>
</body>
</html>
```
## 兄弟節點
Element.nextSibling
Element.previousSibling
Element.nextElementSibling
Element.previousElementSibling
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<div>我是div</div>
<span>我是span</span>
<script>
var div = document.querySelector('div');
// nextSibling 下一個兄弟節點 包含 元素節點 或 文本節點
console.log(div.nextSibling); // 文本節點
console.log(div.previousSibling); // 文本節點
// 下一個兄弟元素節點 找不到返回null
console.log(div.nextElementSibling); // <span>我是span</span>
console.log(div.previousElementSibling); // null
</script>
</body>
</html>
```
## 創建元素
var li = document.createElement('li');
ul.appendChild(li);
var lili = document.createElement('li');
ul.insertBefore(lili, ul.children[0]);
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<ul>
<li>123</li>
</ul>
<script>
var li = document.createElement('li');
var ul = document.querySelector('ul');
// 類似數組中的push
ul.appendChild(li); // 123的下一個
// 插入節點
var lili = document.createElement('li');
ul.insertBefore(lili, ul.children[0]); // 123的上一個
</script>
</body>
</html>
```
## 留言板
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<textarea name="" id="" cols="30" rows="10">123</textarea>
<button>發布</button>
<ul></ul>
<script>
var btn = document.querySelector('button');
var text = document.querySelector('textarea');
var ul = document.querySelector('ul');
btn.onclick = function () {
if (text.value == '') {
alert('您沒有輸入內容');
return false; // 阻止表單提交
} else {
var li = document.createElement('li');
li.innerHTML = text.value;
// ul.appendChild(li);
ul.insertBefore(li, ul.children[0]);
}
};
</script>
</body>
</html>
```
## 刪除節點
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<button>刪除</button>
<ul>
<li>熊大</li>
<li>熊二</li>
<li>光頭強</li>
</ul>
<script>
var ul = document.querySelector('ul');
var btn = document.querySelector('button');
// ul.removeChild(ul.children[0]);
btn.onclick = function () {
if (ul.children.length == 1) {
ul.removeChild(ul.children[0]);
this.disabled = true;
} else {
ul.removeChild(ul.children[0]);
}
};
</script>
</body>
</html>
```
## 刪除留言
href='javascript:;'
不修改網址、不跳轉連結
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<textarea name="" id="" cols="30" rows="10">123</textarea>
<button>發布</button>
<ul></ul>
<script>
var btn = document.querySelector('button');
var text = document.querySelector('textarea');
var ul = document.querySelector('ul');
btn.onclick = function () {
if (text.value == '') {
alert('您沒有輸入內容');
return false;
} else {
var li = document.createElement('li');
li.innerHTML = text.value + "<a href='javascript:;'>刪除</a>";
// ul.appendChild(li);
ul.insertBefore(li, ul.children[0]);
var as = document.querySelectorAll('a');
for (var i = 0; i < as.length; i++) {
as[i].onclick = function () {
ul.removeChild(this.parentNode);
};
}
}
};
</script>
</body>
</html>
```
## 複製節點
cloneNode(true) 深拷貝
cloneNode(false) 淺拷貝
cloneNode() 淺拷貝
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
var ul = document.querySelector('ul');
var lili = ul.children[0].cloneNode(true);
ul.appendChild(lili);
</script>
</body>
</html>
```
## 動態生成表格
```
<!DOCTYPE html>
<html lang="en">
<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>
</head>
<body>
<table cellspacing="0">
<thead>
<tr>
<th>姓名</th>
<th>科目</th>
<th>成績</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>張嘉航</td>
<td>JavaScript</td>
<td>100</td>
<td><a href="#">刪除</a></td>
</tr>
<tr>
<td>張嘉航</td>
<td>JavaScript</td>
<td>100</td>
<td><a href="#">刪除</a></td>
</tr>
<tr>
<td>張嘉航</td>
<td>JavaScript</td>
<td>100</td>
<td><a href="#">刪除</a></td>
</tr>
<tr>
<td>張嘉航</td>
<td>JavaScript</td>
<td>100</td>
<td><a href="#">刪除</a></td>
</tr>
</tbody>
</table>
</body>
<script>
var datas = [
{
name: '張葦航',
subject: 'JavaScript',
score: 100
},
{
name: '張葦航',
subject: 'JavaScript',
score: 100
},
{
name: '張葦航',
subject: 'JavaScript',
score: 100
},
{
name: '張葦航',
subject: 'JavaScript',
score: 100
}
];
var tbody = document.querySelector('tbody');
for (var i = 0; i < datas.length; i++) {
var tr = document.createElement('tr');
tbody.appendChild(tr);
for (var k in datas[i]) {
var td = document.createElement('td');
console.log(datas[i]);
console.log(datas[i][k]);
td.innerHTML = datas[i][k];
tr.appendChild(td);
}
var td = document.createElement('td');
td.innerHTML = '<a href ="javascript:;">刪除</a>';
tr.appendChild(td);
}
var as = document.querySelectorAll('a');
for (var i = 0; i < as.length; i++) {
as[i].onclick = function () {
tbody.removeChild(this.parentNode.parentNode);
};
}
</script>
</html>
```