DOM(文档对象模型)操作是前端开发人员必须熟练掌握的技术,在与用户进行交互、处理后端返回的JSON(XML)文件等地方都需要用到DOM操作,下面列举一些常用的DOM操作
* * * * *
####1.获取节点
~~~
document.getElementById("myDiv");
document.getElementsByTagName("div");//一个集合,[0]获取集合中的第一个元素
document.getElementsByClassName("myDiv");//IE9以下不支持
~~~
<br>
####2.创建节点
~~~
var myDiv = document.createElement("myDiv");
myDiv.innerHTML="我是新创建的节点";
document.getElementsByTagName("body")[0].appendChild(myDiv)//将新创建的节点追加到body中
~~~
document.createTextNode()方法同样用于添加文本,相对于innerHTML更加安全,并且兼容各主流浏览器
<br>
####3.插入、删除、创建节点
~~~
var father=document.getElementById("father");//获取父层div引用
var node1=document.getElementById("son");//获取父层下的一个子元素
var node2=document.createElement("div");
node2.innerHTML="我是新创建的";
father.appendChild(node2);//node2插入到最后的位置
father.insertBefore(node2,null);//同上
father.insertBefore(node2,node1);//node2插入到node1前面
father.replaceChild(node2,node1);//node2替换掉node1
father.removeChild(node1);//将node1从father节点中删除
~~~
<br>
####4.节点复制
~~~
var cloneNode=father.cloneNode(true);//参数为true代表深复制(复制节点及其整个子节点树)参数为false代表浅复制(只复制节点本身)
~~~
<br>
####5.设置、获取、删除节点属性
~~~
myDiv.setAttribute("id","first");
myDiv.getAttribute("id");//不能获取用户自定义的属性
myDiv.removeAttribute("id");
~~~
<br>
####6.常用节点属性
~~~
myDiv.nodeName;//返回节点的名称
myDiv.nodeType;//返回节点的类型
myDiv.nodeValue;//返回节点的值(用于input等表单)
myDiv.childNodes;//返回子节点集合(包含空白换行等非元素节点)
myDiv.firstChild;//返回第一个子节点
myDiv.firstElementChild;//返回第一个元素子节点
myDiv.lastChild;//返回最后一个子节点
myDiv.lastElementChild;//返回最后一个元素子节点
myDiv.previousSibling;//返回前一个兄弟节点
myDiv.previousElementSibling;//返回前一个元素兄弟节点
myDiv.nextSibling;//返回后一个兄弟节点
myDiv.nextElementSibling;//返回后一个元素兄弟节点
myDiv.parentNode;//返回父节点
element.attributes["id"];//返回含有id属性的节点集合
~~~
<br>
####7.处理后端返回的JSON
~~~
//xhr.onreadystatechange函数中
var json=JSON.parse(xhr.responseText);
for(var i=0;i<json.length;i++)
{
//创建节点、添加属性、插入到document中
}
~~~
<br>
####8.DOM操作优化
DOM操作会对浏览器的性能造成影响,因此要尽可能的减少甚至避免DOM操作。
~~~
//不推荐的做法
for(var i=0;i<json.length;i++)
{
var div = document.createElement("div");
div.innerHTML(json[i]);
father.appendChild(div);
}
~~~
~~~
//推荐的做法
var fragment = document.createDocumentFragment();
for(var i=0;i<json.length;i++)
{
var div = document.createElement("div");
div.innerHTML(json[i]);//用innerHTML来代替createTextNode
fragment.appendChild(div);
}
father.appendChild(fragment);
~~~
当DOM操作规模非常大时,将容器的display设为none,等节点操作完成后再设为可见,原理是隐藏的元素不会产生reflow(重构)
尽可能地通过添加class来修改样式
- html/css
- 不一样的css3之Transform
- 不一样的css3之Transition
- 不一样的css3之Animation
- Less初学
- Sass初学
- 水平垂直居中那些事
- css优先级
- css基础教学
- javascript
- 浅谈javascript事件处理程序
- cookie,localStorage,sessionStorage的区别
- Ajax
- 说说JSON
- 数组常用的方法
- 字符串常用的方法
- 闭包之我的理解
- 常用DOM操作
- 扒一扒所谓的面向对象
- JS Blob对象
- ES6学习笔记(一)
- ES6学习笔记(二)
- 用ES6书写React
- React+Redux实战总结
- 基于Express搭建开发环境
- 其他
- github初学
- 轻松配置Webpack
- asp.net学习笔记
- ado.net
- 如何使用ajax进行前后端交互
- 银行大厅自助服务系统需求分析
- 西电银行开发手册
- 接口
- ajax