一、DOM 基本操作(大部分都是类数组)——方法类操作
1.对节点的增删改查
()括号里面都不用写.或#
查
查看元素节点
document 代表整个文档
(如果给 html 标签上面再套一层标签就是 document)
document.getElementById()
元素 id 在 Ie8 以下的浏览器,不区分 id 大小写,而且
也返回匹配 name 属性的元素,通过 id 标识我们来选择这个元素,一一对应
除了 id 以外,其余选择出来的都是一组,很少用 id 选择器
.getElementsByTagName()
标签名,这是一个类数组,
最主流的用法,经常用
把页面里面所有的 div 都选择出来
从 dom 开始,我们所学的一切系统给我们生成的成组的东西,基本上都是类数组
加个[0]就选中了第一个 div,如果不加 0,那个 div 表示的是一个数组,设置背景颜色就会报错
getElementsByName();
IE 不支持需注意,只有部分标签 name 可生效(表单,表单
元素,img,iframe)
不是在所有的浏览器都能用——开发一般不用
把下面所有的 div 都拿出来
只拿出第二个 div,加上[1] ,或者在控制台上打 div[1]
选择第一个 p 的方式如下
只拿出 demo 的 p 标签写法如下:
注意哪怕整个文档只有一个 demo,也要加[0],不然选出来的就是一个组
.getElementsByClassName()
类名 ->缺点: ie8 和 ie8 以下的 ie 版本中没有,可以多个 class 一起,不是所有浏览器都能用
.querySelector()
css 选择器,只能选一个,在 ie7 和 ie7 以下的版本中没有
.querySelectorAll()
css 选择器,全选,选一组,在 ie7 和 ie7 以下的版本中没有
.querySelectorAll()和.querySelector()
选出来的元素不是实时的(是静态的)
所以一般不用,其他的再怎么修改,跟原来的没有关系
id 选择器不能太依赖,一般当顶级框架存在,在 css 中一般用 class 选择器
querySelector()和.querySelectorAll()选出来的元素不是实时的,是静态的,是副本
下面的都是实时的
querySelectorAll()选中了所有的 div,但是实时操作不能实时反馈
二、DOM 基本操作——非方法类的操作
遍历节点树:(灵活,兼容好)——关系类的选择
- parentNode → 父节点 (最顶端的 parentNode 为#document);
- childNodes → 子节点们(直接的节点数)节点包括文本节点,属性节点
- firstChild → 第一个子节点
- lastChild → 最后一个子节点
- nextSibling →后一个兄弟节点
- previousSibling → 前一个兄弟节点
parentNode —》》父节点
<div>
<span></span>
<strong></strong>
<div>
<p></p>
</div>
</div>
<script>
var strong = document.getElementsByTagName('strong')[0];
</script>
childNodes-----》》子节点们
<div>
<strong>
<span>1</span>
</strong>
<span></span>
<em></em>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
节点为什么是7?
第一个节点是<div>
后面的文本节点(空格回车),
第二个节点是元素节点<strong><span>1</span></strong>
,
第三个节点是跟着的文本节点(空格回车),
第四个节点是<span></span>
,
第五个是跟着的文本节点(空格回车),
第六个是<em></em>
,
第七个是跟着的文本节点(空格回车)
节点的类型
后面的数字是调用nodeType返回的数字
元素节点----1
属性节点----2(基本没用)
文本节点----3
注释节点----8
document—9
DocumentFragment-----11
<div>
<!-- this is comment -->
<strong></strong>
<span></span>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
第一个节点是
<div>
后面的文本节点(空格回车),
第二个节点是注释节点,
第三个节点是跟着的文本节点(空格回车),
第四个节点是元素节点<strong></strong>
,
第五个是跟着的文本节点(空格回车),
第六个是<span></span>
,
第七个是跟着的文本节点(空格回车)
<div>
123
<!-- this is comment -->
<strong></strong>
<span></span>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
七个,123和空格等是一个文本
firstChild 和 lastChild
<div>
123
<!-- this is comment -->
<strong></strong>
<span></span>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
** nextSibling →后一个兄弟节点 ,previousSibling → 前一个兄弟节点**
<div>
<!-- this is comment -->
<strong></strong>
<span></span>
</div>
<script>
var strong = document.getElementsByTagName('strong')[0];
</script>
基于元素节点树的遍历(不含文本节点)
(除children外,其余ie9及以下不兼容)
<div>
<!-- this is comment -->
<strong></strong>
<span></span>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
children—>只返回当前元素的元素子节点
node.childElementCount ( === node.children.length)
当前元素节点的子元素节点个数(IE 不兼容)——基本不用,因为与 length 相等
firstElementChild -> 返回的是第一个元素节点(IE 不兼容)
lastElementChild -> 返回的是最后一个元素节点(IE 不兼容)
nextElementSibling / previousElementSibling
返回后一个/前一个兄弟元素节点(IE 不兼容)
除 children 外,parentElement、node.childElementCount、firstElementChild、lastElementChild、nextElementSibling、 previousElementSibling 在 ie9 及以下不兼容
真正常用的就是 children,兼容性好
每一个节点的四个属性
1、nodeName
元素的标签名,以大写形式表示,只读,不能写
例 nodeName
<div>
123
<!-- this is comment -->
<strong></strong>
<span></span>
<em></em>
<i></i>
<b></b>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
2、nodeValue
Text 文本节点或 Comment 注释节点的文本内容,可读写
<div>
123
<!-- this is comment -->
<strong></strong>
<span></span>
<em></em>
<i></i>
<b></b>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
3、nodeType(最有用)
该节点的类型,只读,返回这个 div 的所有的元素节点
把 div 下面所有的直接子元素节点挑出来,放在数组里面返回,不能用 children
<div>
123
<!-- this is comment -->
<strong></strong>
<span></span>
<em></em>
<i></i>
<b></b>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
function retElementChild(node) {
//no children
var temp = {
length: 0,
push: Array.prototype.push,
splice: Array.prototype.splice
},
child = node.childNodes;
len = child.length;
for (var i = 0; i < len; i++) {
if (child[i].nodeType === 1) {
temp.push(child[i]);
}
}
return temp;
}
console.log(retElementChild(div));
</script>
4、attributes
Element 节点的属性集合
<div id="only" class="demo"></div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
属性名不能改,属性值可以改,但是我们一般不用这种方法
我们一般用getAttribute和setAttribute去取
5、Node.hasChildNodes()
节点的一个方法Node.hasChildNodes():
判断是否有子节点,返回值是true或false
<div id="only" class="demo">
<span></span>
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
<div id="only" class="demo">
<!-- this is comment -->
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
<div id="only" class="demo">
</div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
当且仅当这种情况下是 false(没空格,没回车)
<div id="only" class="demo"></div>
<script>
var div = document.getElementsByTagName('div')[0];
</script>
属性的节点是 div 上面的,不是 div 里的