JavaScript之DOM_动力节点Java学院整理
由于html文档被浏览器解析后就是一棵dom树,要改变html的结构,就需要通过javascript来操作dom。
始终记住dom是一个树形结构。操作一个dom节点实际上就是这么几个操作:
- 更新:更新该dom节点的内容,相当于更新了该dom节点表示的html的内容;
- 遍历:遍历该dom节点下的子节点,以便进行进一步操作;
- 添加:在该dom节点下新增一个子节点,相当于动态增加了一个html节点;
- 删除:将该节点从html中删除,相当于删掉了该dom节点的内容以及它包含的所有子节点。
在操作一个dom节点前,我们需要通过各种方式先拿到这个dom节点。最常用的方法是document.getelementbyid()
和document.getelementsbytagname()
,以及css选择器document.getelementsbyclassname()
。
由于id在html文档中是唯一的,所以document.getelementbyid()
可以直接定位唯一的一个dom节点。
document.getelementsbytagname()
和document.getelementsbyclassname()
总是返回一组dom节点。要精确地选择dom,可以先定位父节点,再从父节点开始选择,以缩小范围。
例如:
// 返回id为'test'的节点: var test = document.getelementbyid('test'); // 先定位id为'test-table'的节点,再返回其内部所有tr节点: var trs = document.getelementbyid('test-table').getelementsbytagname('tr'); // 先定位id为'test-div'的节点,再返回其内部所有class包含red的节点: var reds = document.getelementbyid('test-div').getelementsbyclassname('red'); // 获取节点test下的所有直属子节点: var cs = test.children; // 获取节点test下第一个、最后一个子节点: var first = test.firstelementchild; var last = test.lastelementchild;
第二种方法是使用queryselector()
和queryselectorall()
,需要了解selector语法,然后使用条件来获取节点,更加方便:
// 通过queryselector获取id为q1的节点: var q1 = document.queryselector('#q1'); // 通过queryselectorall获取q1节点内的符合条件的所有节点: var ps = q1.queryselectorall('div.highlighted > p');
注意:低版本的ie<8不支持queryselector
和queryselectorall
。ie8仅有限支持。
严格地讲,我们这里的dom节点是指element
,但是dom节点实际上是node
,在html中,node
包括element
、comment
、cdata_section
等很多种,以及根节点document
类型,但是,绝大多数时候我们只关心element
,也就是实际控制页面结构的node
,其他类型的node
忽略即可。根节点document
已经自动绑定为全局变量document
。
练习
如下的html结构:
javascript
java
python
ruby
swift
scheme
haskell
<!-- html结构 --> <div id="test-div"> <div class="c-red"> <p id="test-p">javascript</p> <p>java</p> </div> <div class="c-red c-green"> <p>python</p> <p>ruby</p> <p>swift</p> </div> <div class="c-green"> <p>scheme</p> <p>haskell</p> </div> </div>
请选择出指定条件的节点:
// 选择<p>javascript</p>: var js = ???; // 选择<p>python</p>,<p>ruby</p>,<p>swift</p>: var arr = ???; // 选择<p>haskell</p>: var haskell = ???;