来源博客:【Harryの心阁】
Dom 树
思维导图
自定义属性
- 在页面暂时保存数据而不是数据库
- 规定自定义属性以
data-
开头,自定义属性 - h5新增获取
属性.dataset.(要获取的属性)
,必须以data开头 - 如果是list-index-name 使用新特性时获取采用驼峰命名法
节点操作
- 兄弟关系和父子关系,层次关系(node)
- nodeType(节点类型),nodeName(节点名称),nodeValue(节点值)
- 元素节点nodeType=1,属性为2,文本,空格换行等等为3
- 父亲节点
parentNode
找不到父节点返回为null
,返回的是最近的父元素 - 孩子节点
childNodes
得到的所有节点包括元素节点文本节点等等,一般不使用childNodes,使用非标准的parentNode.children
可获取所有的子元素 firstchild/lastchild
获取的是第一个节点文本节点或者元素节点firstElementChild/last
返回的是第一个子元素节点(兼容性问题)
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
</ul>
<script>
var ul = document.querySelector('ul');
var lis = ul.querySelectorAll('li');
console.log(ul.children);
console.log(ul.firstElementChild);
console.log(ul.children[0]);
console.log(ul.children[ul.children.length - 1]);
</script>
兄弟节点
nextSibling
下一个兄弟节点,nextElementSibling
- 和父亲节点类似,
previousELementSibling
上一个元素节点
添加节点
node.appendChild(child)
node父级 child是子级- 创建元素节点 document.createElement(‘元素’)
- node.insertBefore(child,指定元素)
实例化操作
- 演示站点 【第一屏】
- 大量使用节点,比如节点的增加与删除等等
删除节点
- 父元素.removeChild[索引号]
disabled
禁用按钮- 阻止链接跳转,
javascript:void(0);
或者javascript:;
复制节点
- 括号为空或者里面时false 浅拷贝,只复制标签不复制内容
- 括号里面为true,深拷贝,复制标签及其里面的内容
动态创建表格
- 使用双循环,类似于冒泡排序,一个循环控制行,一个循环控制列
- 使用for…in 遍历数组属性,属性值
- 巧妙使用删除节点实现整行或者整列删除
<style>
* {
padding: 0;
margin: 0;
}
table{
border: 1px solid #888;
border-bottom: 0;
border-right: 0;
border-radius: 5px;
overflow: hidden;
}
th,
td {
border-right: 1px solid #888;
border-bottom: 1px solid #888;
}
thead{
background-color: #ccc;
}
tbody{
text-align: center;
}
table {
width: 400px;
margin: 12.5rem auto;
}
</style>
<body>
<table cellspacing="0">
<thead>
<tr>
<th>name</th>
<th>subject</th>
<th>score</th>
<th>你好世界</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<script>
var dates = [{
name: 'G先生',
subject: 'java',
score: 100
},
{
name: 'Q先生',
subject: 'java',
score: 99
},
{
name: 'W先生',
subject: 'java',
score: 98
},
{
name: 'T先生',
subject: 'java',
score: 97
}];
console.log(dates.length);
var tbody = document.querySelector('tbody');
for(var i = 0;i<dates.length;i++){
var tr = document.createElement('tr');
tbody.appendChild(tr);
for(var k in dates[i]){
var td =document.createElement('td');
td.innerHTML = dates[i][k];
tr.appendChild(td);
}
var td = document.createElement('td');
td.innerHTML = '<a href="javascript:;">删除</a>'
tr.appendChild(td);
// 获取要点击得孩子节点,删除父元素,就需要找上级的上级
tr.children[tr.children.length - 1].onclick = function(){
tbody.removeChild(this.parentNode);
}
}
</script>
创建元素
- document.write(’’),如果页面文档流加载完毕,在调用后页面重绘效果不好
- innerHTML 创建多个元素时效率会低一些(采取拼接字符串),采取数组时效率最高
arr.push(’’) 在转换为arr.join(’’)字符串
- document.createElement(’’) 创建多个元素时效率较第二种高,使用数组转化时效率最高