操作dom一般是如下4个:
更新:更新该DOM节点的内容,相当于更新了该DOM节点表示的HTML的内容;
遍历:遍历该DOM节点下的子节点,以便进行进一步操作;
添加:在该DOM节点下新增一个子节点,相当于动态增加了一个HTML节点;
删除:将该节点从HTML中删除,相当于删掉了该DOM节点的内容以及它包含的所有子节点。
document.getElementById();//根据ID获取DOM结构
document.getElementsByTagName();//根据class获取DOM结构
document.getElementsByClassName();//总是返回一组DOM节点(数组)。要精确地选择DOM,可以先定位父节点,再从父节点开始选择,以缩小范围。
// 通过querySelector获取ID为q1的节点:
var q1 = document.querySelector('#q1');
// 通过querySelectorAll获取q1节点内的符合条件的所有节点:
var ps = q1.querySelectorAll('div.highlighted > p');
1:更新DOM
直接修改节点的文本,有两种方法。第一种:修改innerHTML属性,不但可以修改一个DOM节点的文本内容,还可以直接通过HTML片段修改DOM节点内部的子树
// 获取<p id="p-id">...</p>
var p = document.getElementById('p-id');
// 设置文本为abc:
p.innerHTML = 'ABC'; // <p id="p-id">ABC</p>
// 设置HTML:
p.innerHTML = 'ABC <span style="color:red">RED</span> XYZ';
// <p>...</p>的内部结构已修改
第二种是修改innerText或textContent属性,这样可以自动对字符串进行HTML编码,保证无法设置任何HTML标签:
// 获取<p id="p-id">...</p>
var p = document.getElementById('p-id');
// 设置文本:
p.innerText = '<script>alert("Hi")</script>';
// HTML被自动编码,无法设置一个<script>节点:
// <p id="p-id"><script>alert("Hi")</script></p>
两者的区别在于读取属性时,innerText不返回隐藏元素的文本,而textContent返回所有文本。另外注意IE<9不支持textContent。
2:插入DOM
若是<div> </div>之间是空的就可以用innerHtml来插入,若是不为空就不能用innerHtml,因为这个会替换原本的文本。
第一种:appendChild(向父节点后添加子节点)
<!-- HTML结构 -->
<p id="js">JavaScript</p>
<div id="list">
<p id="java">Java</p>
<p id="python">Python</p>
<p id="scheme">Scheme</p>
</div>
把<p id="js">JavaScript</p>添加到<div id="list">的最后一项:
var js = document.getElementById('js'),
list = document.getElementById('list');
list.appendChild(js);
<!-- HTML结构 因为我们插入的js节点已经存在于当前的文档树,因此这个节点首先会从原先的位置删除,再插入到新的位置。-->
<div id="list">
<p id="java">Java</p>
<p id="python">Python</p>
<p id="scheme">Scheme</p>
<p id="js">JavaScript</p>
</div>
var
list = document.getElementById('list'),
haskell = document.createElement('p');
haskell.id = 'haskell';
haskell.innerText = 'Haskell';
list.appendChild(haskell);
<!-- HTML结构 -->
<div id="list">
<p id="java">Java</p>
<p id="python">Python</p>
<p id="scheme">Scheme</p>
<p id="haskell">Haskell</p>
</div>
第二种:insertBefore
还是以上面的HTML为例,假定我们要把Haskell插入到Python之前:
var haskell = document.createElement('p'),
python = document.getElementById('python'),
list = document.getElementById('list');
haskell.id = 'haskell';
haskell.innerText = 'Haskell';
list.insertBefore(haskell,python);
<!-- HTML结构 -->
<div id="list">
<p id="java">Java</p>
<p id="haskell">Haskell</p>
<p id="python">Python</p>
<p id="scheme">Scheme</p>
</div>
使用insertBefore重点是要拿到一个“参考子节点”的引用。很多时候,需要循环一个父节点的所有子节点,可以通过迭代children属性实现
var i,c,
list = document.getElementById('list');
for(i=0;i<list.children.length;i++){
c = list.children[i];//拿到第i个子节点
}
<!-- HTML结构 按照字母顺序重新-->
<ol id="test-list">
<li class="lang">Scheme</li>
<li class="lang">JavaScript</li>
<li class="lang">Python</li>
<li class="lang">Ruby</li>
<li class="lang">Haskell</li>
</ol>
var list = document.getElementById('test-list'),
linked = document.getElementsByClassName('lang'),
arr=[];
for(var i=0;i<linked.length;i++){
arr.push(linked[i]);
}
arr.sort(function(x,y){
var x = x.innerText;
var y = y.innerText;
if(x>y){return 1;}
if(x<y){return -1;}
if(x=y){return 0;}
});
for(var i=0;i<arr.length;i++){
list.appendChild(arr[i]);
}
3:删除DOM