DOM
概念
dom:docment object model 文档对象模型
DOM 都是由节点组成的
节点可以分为三大类:
元素节点 html标签
文本节点 标签中的文字(空格,换行)
属性节点 标签的属性
学习dom,就是学习对节点的操作
修改:修改DOM节点的内容。
遍历:遍历DOM节点下的子节点,方便下一步操作。
添加:在DOM节点下添加一个子节点。
删除:将该节点从HTML中删除。也相当于删除了它包含的所有内容以及所有子节点。
DOM可以做什么:
1.找对象(元素节点)
2.设置元素节点的属性值、
3。动态删除和创建节点。
4.事件的响应触发
获取节点方法
<body>
<h1 id="title1">我是1级标题</h1>
<h2 class="title2">我是2级标题</h2>
<h3>我是3级标题</h3>
<div class="box1 title2" id="box">我是div容器
<p name="pp">我是p段落</p>
</div>
</body>
1.getElementById
格式:node.getElementById(“ID”),
功能:从node节点开始,通过ID查找节点。返回对拥有指定id的第一个对象的引用
<script>
window.onload = function() {
//通过id获取元素节点
var tmp = document.getElementById("title1");
}
</script>
2.getElementsByTagName
通过标签名查找节点,返回带有指定名称的对象的伪数组(集合)要获取指定类名对象通过下标获取
格式:node.getElementsByTagName(“标签名”);
window.onload = function() {
var tmp1 = document.getElementsByTagName("div")[0];
console.log(tmp1);
}
【注意】getElementsByTagName/getElementsByClassName 获取到的是元素节点,元素节点中没有getElementById方法
document对象中是可以使用getElementById的。
window.onload = function() {
var tmp1 = document.getElementsByTagName("div")[0];
var tmp2 = tmp1.getElementsByTagName("p");
console.log(tmp3);
}
3.getElementsByClassName
通过类名去查找节点,返回带有指定类名的对象的伪数组(集合)要获取指定类名对象通过下标获取
格式:node.getElementsByClassName(“类名”);
window.onload = function() {
var tmp3 = document.getElementsByClassName("title2")[0];
console.log(tmp3);
}
4.getElementsByName()
通过name属性值去获取节点,返回带有指定属性名的对象的伪数组(集合)要获取指定类名对象通过下标获取
最常用在 表单元素中。
低版本的IE不支持。
5.querySelector()
格式:node.querySelector(css选择器)
返回值:
如果找到选择器匹配的元素,则返回第一个元素。
如果没找到,则返回null
<script>
window.onload = function() {
var bBox = document.querySelector(".box");
var bBox = document.querySelector(".name");
console.log(bBox);
}
</script>
6.querySelectorAll()
格式:node.querySelector(css选择器)
返回值:
如果找到选择器匹配的元素,则返回全部。
如果没找到,则返回null
<script>
window.onload = function() {
var bBox1 = document.querySelectorAll(".box");
console.log(bBox1);
}
</script>
nodelist 伪数组 常规的数组方法对伪数组是无效的 length 【下标】
node 表示传入的节点,获取该节点的元素节点。
操作元素节点的属性
标签上的属性分类:
1.原生属性
2.自定义属性
3.H5 自定义属性
1.原生属性
语法:元素.属性名
修改/新增:
元素.属性名 = “值”
window.onload = function() {
var arr = document.getElementById("box");
arr.id = "box2";
console.log(arr);
}
获取:
元素.属性名
window.onload = function() {
var arr = document.getElementById("box");
console.log(arr);
}
【注意】class属性是例外,不能直接通过属性名获取,而是用className
删除
window.onload = function() {
var arr = document.getElementById("box");
arr.removeAttribute("id");
console.log(arr);
}
2.自定义属性
不能直接使用 元素. 这个语法来获取。
三个方法去操作:
获取 getAttribute("属性名");
返回值:字符串
<body>
<img src="img/1.jpg" alt="" class="desc">
</body>
<script>
window.onload = function() {
var arr1 = document.getElementsByClassName("desc")[0];
var a = arr1.getAttribute("src");
console.log(a);
}
</script>
设置 setAttribute("属性名","属性值");
<body>
<img src="img/1.jpg" alt="" class="desc">
</body>
<script>
window.onload = function() {
var arr1 = document.getElementsByClassName("desc")[0];
var a = arr1.setAttribute("name", "index");
console.log(a);
}
</script>
删除
removeAttribute(“属性名”)
window.onload = function() {
var arr1 = document.getElementsByClassName("desc")[0];
arr1.className += " info"
console.log(arr.className);
}
【注意】这三个方法也可以操作原生属性
3.H5 自定义属性dataSet
每一个元素节点上都有一个属性:dataSet
里面包含了所有的H5自定义属性。
键值对结构: 例子;data-id =“idBox”
key:data-XXX xxx的内容。
value:属性值
获取:
元素.dataset.key
window.onload = function() {
var arr = document.getElementsByTagName("div")[0];
console.log(arr.dataset.b);
}
设置:
元素.dataset.key = “值”
window.onload = function() {
var arr = document.getElementsByTagName("div")[0];
arr.dataset.b = "bb";
console.log(arr);
}
<body>
<div></div>
<script>
var box = document.querySelector("div");
box.dataset.index = "aa"
console.log(box);
</script>
</body>
删除
delete 元素.dataset.key
window.onload = function() {
var arr = document.getElementsByTagName("div")[0];
delete arr.dataset.b;
console.log(arr);
}
操作元素的类名
1.按照原生属性的方式来操作
获取:
元素.className
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
console.log(box.className);
}
</script>
设置:
元素.className = “值”
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
box.className = "aa"
console.log(box);
}
</script>
追加:
元素.className += " 值";
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
// 添加的新类名前一定要有一个空格
box.className += " aa"
console.log(box);
}
</script>
【注意】 追加时,值的前面要加一个空格。
删除:
1.重新设置一遍。
2.
2.1 获取classname属性值、
2.2 按照空格去分割字符串
2.3 遍历数组,将要删除的字符串删除
2.4 数组的join方法
2.H5标准给我们一个API
元素节点都有一个属性叫做:classList
里面包含了所有的class值。
获取:
元素.classList 获取class值的集合。
想要获取单个,使用下标。
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
console.log( box.classList);
}
</script>
新增:
元素.classList.add(“新增的类名”)
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
box.classList.add("desc");
console.log(box);
}
</script>
删除:
元素.classList.remove(“删除的类名”)
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
box.classList.remove("aa");
console.log(box);
}
</script>
替换:
元素.classList.replace(“旧类名”,“新类名”) ;
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
//第一个参数为要被替换的类名,第二个参数为新类名
box.classList.replace("aa", "aaaa");
console.log(box);
}
</script>
toggle() 切换
语法:元素.classList.toggle(类名)
当元素拥有这个类名时,将类名删除
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
box.classList.toggle("aa");
console.log(box);
}
</script>
当元素没有这个类名时,将类名添加
<body>
<div class="box">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
box.classList.toggle("ccc");
console.log(box);
}
</script>
操作元素节点中的内容
1.innerHTMl
获取元素节点中除了本身的标签外,所有的HTML代码。
获取:
元素.innerHTML
<body>
<div class="box index aa bbb">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
console.log(box.innerHTML);
}
</script>
设置:
元素.innerHTMl = “新的内容”
<body>
<div class="box index aa bbb">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
box.innerHTML = "<h1>我是新内容!</h1>";
console.log(box.innerHTML);
}
</script>
【注意】 innerHTML 会覆盖原有的内容,而且会解析其中的标签。
2.innerText
获取元素节点中的文本内容,会覆盖原有的内容,不会解析内容中的标签。
获取:
元素.innerText
设置:
元素.innerText = “新的内容”;
3.value
主要使用在表单元素中。
操作表单元素节点的value属性。
获取:
表单元素节点.value
<body>
<input type="text" value="我是input标签!">
</body>
<script>
window.onload = function() {
var inp = document.querySelector("input");
console.log(inp.value);
}
</script>
设置:
表单元素节点.value = “值”
<body>
<input type="text" value="我是input标签!">
</body>
<script>
window.onload = function() {
var inp = document.querySelector("input");
inp.value = "请输入";
}
</script>
操作元素节点的样式
元素节点的样式:
样式:
行内
内嵌
外链
行内样式:
原生属性的方式获取
元素.style.样式的属性名
<style>
.box {
width: 200px;
height: 200px;
background-color: coral;
}
</style>
<body>
<div class="box ">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
}
</script>
【注意】如果属性名是多个单词,第二个单词首字母大写,删除中划线。
该方法只能获取行内。
设置样式
语法:元素.style.样式名 = “值”;
<style>
.box {
width: 200px;
height: 200px;
background-color: coral;
}
</style>
<body>
<div class="box ">我是第1个div标签</div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("box")[0];
box.style.backgroundColor = "red";
box.style.width = "100px";
}
</script>
获取元素的有效样式
标准浏览器:
getComputedStyle(要获取样式的元素)
IE低版本:(IE8以下)
元素.currentStyle.样式属性名 box.currentStyle.width
属性节点
属性节点:
获取元素节点的属性节点
元素.attributes
<body>
<div id=" aa" class="index bb"></div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("bb")[0];
var item = box.attributes;
console.log(item);
}
</script>
单个属性节点:
元素.attributes.getNamedItem(“属性名”);
<body>
<div id=" aa" class="index bb"></div>
</body>
<script>
window.onload = function() {
var box = document.getElementsByClassName("bb")[0];
var item = box.attributes.getNamedItem("class");
console.log(item);
}
</script>
通过节点关系获取节点
DOM节点不是孤立存在,我们可以通过节点之间的关系去获取他们。
节点的关系,是以属性的方式存在的。
获取父节点。
节点.parentNode
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector(".index");
console.log(item.parentNode);
}
</script>
获取兄弟节点
1.下一个节点
node.nextSibling
对于标准浏览器,标签,空文档,换行都属于节点。
IE低版本:指下一个元素节点。
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector(".index");
console.log(item.nextSibling);
}
</script>
2.下一个元素节点
node.nextElementSibling
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector(".index");
console.log(item.nextElementSibling);
}
</script>
兼容写法:
下一个兄弟节点 = 节点.nextElementSibling||节点.nextSibling
3.上一个节点
node.previousSibling
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector(".index");
console.log(item.previousSibling);
}
</script>
4.上一个元素节点
node.previousElementSibling
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector(".index");
console.log(item.previousElementSibling);
}
</script>
获取单个子节点
1.第一个子节点
node.firstChild
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector("#id");
console.log(item.firstChild);
}
</script>
2.获取第一个元素节点
node.firstElementChild
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector("#box");
console.log(item.firstElementChild);
}
</script>
3.获取最后一个子节点
node.lastChild
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector("#id");
console.log(item.firstElementChild);
}
</script>
4.获取最后一个元素节点
node.lastElementChild
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector("#id");
console.log(item.firstElementChild);
}
</script>
获取所有子节点
1.获取所有子节点
语法:node.childNodes
返回的是子节点的伪数组(元素节点,文本节点,注释节点)
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector("#id");
console.log(item.childNodes);
}
</script>
2.获取所有的元素子节点
语法:node.children
返回元素节点。使用最多的方法。
<body>
<div id="box">
<div class="index "></div>
<p class="bbb"></p>
<div class="aa"></div>
</div>
</body>
<script>
window.onload = function() {
var item = document.querySelector("#id");
console.log(item.children);
}
</script>
节点的属性
属性:事物的特征
nodeName: 节点名称
注释节点: #comment
文本节点: #text
元素节点: 大写的标签名
属性节点: 属性名
nodeType:节点类型
注释节点:8
文本节点:3
元素节点:1
属性节点:2
nodeValue:节点的值
注释节点:注释内容
文本节点:文本内容
元素节点:null
属性节点:属性值
创建节点
元素节点:document.createElement(“标签名”);
返回值:新的元素节点
创建完成后,需要插入到页面中才能看到
节点操作
创建节点
元素节点:document.createElement(“标签名”);
返回值:新的元素节点
创建完成后,需要插入到页面中才能看到
<body>
</body>
<script>
window.onload = function() {
var box = document.createElement("div");
document.body.appendChild(box)
}
</script>
文本节点
document.createTextNode(内容);
<body>
<div id="box"></div>
</body>
<script>
window.onload = function() {
var box = document.getElementById("box");
var text = document.createTextNode("我是通过JS添加的内容");
box.appendChild(text);
}
</script>
插入节点
node.appendChild
在父节点的最后添加一个新的子节点。
node.insertBefore(新节点,参考节点)
在父节点的参考节点前添加一个新的子节点。
如果参考节点为null,则在父节点的最后添加新的子节点
<body>
<div id="box">
<p class="aa"></p>
<div class="index"></div>
</div>
</body>
<script>
window.onload = function() {
var box = document.getElementById("box");
var index = document.querySelector(".index");
var add = document.createElement("div");
var add2 = document.createElement("div");
box.insertBefore(add, index);
box.insertBefore(add2, null);
}
</script>
删除节点
父节点.removeChild(子节点);
在父节点中移除该子节点
node.remove();
在父节点中移除自身。
<body>
<div id="box">
<p class="aa"></p>
<div class="index"></div>
</div>
</body>
<script>
window.onload = function() {
var box = document.getElementById("box");
var index = document.querySelector(".index");
box.removeChild(index);
}
</script>
替换节点:
用一个节点去替换另外一个节点
父节点.replaceChild(新节点,旧节点);
<body>
<div id="box">
<p class="aa"></p>
<div class="index"></div>
</div>
</body>
<script>
window.onload = function() {
var box = document.getElementById("box");
var aa = document.querySelector(".aa");
var add = document.createElement("div");
box.replaceChild(add, index);
}
</script>
复制节点
node.cloneNode([true]);
复制节点,克隆节点
如果参数为true,则将其所有子节点也克隆。
<body>
<div id="box">
<p class="aa">我是p段落</p>
<div class="index">我是div标签</div>
</div>
</body>
<script>
window.onload = function() {
var box = document.getElementById("box");
var aa = document.querySelector(".aa");
var add = index.cloneNode();
var add2 = index.cloneNode(true);
box.appendChild(add);
box.appendChild(add2);
}
</script>