DOM(文档对象模型)
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)
HTML DOM树
通过这个对象模型,javascript获得了足够的能力来创建动态的HTML
JavaScriptDOM能做什么???
- JavaScript能够改变页面中的所有HTML元素
- JavaScript能够改变页面中的所有HTML属性
- JavaScript能够改变页面中的所有CSS样式
如何获取HTML元素?
- 通过ID得方式获取 在HTML中我都知道ID是唯一得,权重也是比较高
<div id="box">hello,word</div>
<script type="text/javascript">
var oDiv=document.getElementById("box");
</script>
//这样咱就可以获取这个标签当然返回值是一个类数组,他跟数组同样都有length属性
//类数组不能使用数组得方法(切记)
//我们可以通过索引来获取他具体得值
2.通过标签名来获取这个HTML元素节点(当然我们也可以通过ID获取之后获取更加具体得元素)
<div>
<p>hello,word</p>
<p>您好</p>
<p>我好</p>
</div>
<script type="text/javascript">
var oP=document.getElementsByTagName("p");
//返回得仍然是一个类数组,我们可以通过类数组中索引来获取
console.log(oP[0]);
console.log(oP[1]);
console.log(oP[2]);
//我们也可以通过for循环来遍历每一个值
for(var i=0;i<oP.length;i++){
console.log(oP[i]);
}
</script>
3.通过Class来获取对应得类名控制HTML得元素节点
好东西来控制节点当然会有兼容性问题(IE8以下)
<div>
<p class="text">大家好</p>
<p>您好</p>
<p class="text">我好</p>
</div>
<p class="text">广州好迪</p>
<script type="text/javascript">
var oP=document.getElementsByClassName("text");
//返回得仍然是一个类数组,我们可以通过类数组中索引来获取
console.log(oP[0]);
console.log(oP[1]);
console.log(oP[2]);
//我们也可以通过for循环来遍历每一个值
for(var i=0;i<oP.length;i++){
console.log(oP[i]);
}
</script>
4.通过Name属性来获取节点(一般在表单控件中使用)
编号:<input type="text" name="text">
密码:<input type="password" name="text">
姓名:<input type="text" name="text">
<p class="text">广州好迪</p>
<script type="text/javascript">
var oP=document.getElementsByName("text");
//返回得仍然是一个类数组,我们可以通过类数组中索引来获取
console.log(oP[0]);
console.log(oP[1]);
console.log(oP[2]);
//我们也可以通过for循环来遍历每一个值
for(var i=0;i<oP.length;i++){
console.log(oP[i]);
}
</script>
5.通过选择器查找元素(此方法有浏览器兼容性问题IE8以下不支持)
语法格式为:querySelector() 返回的是一个标签
注意
若不是ID选择,只会选取第一个
此方法关于选择器:css选择器 类选择器,ID选择器等。
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
</head>
<body>
编号:<input type="text" name="text" class="serialNum" >
密码:<input type="password" name="text" class="serialNum"id="text1">
姓名:<input type="text" name="text" class="serialNum">
<p class="text">广州好迪</p>
<script type="text/javascript">
var serialNum=document.querySelector("input");//返回第一个input标签
var serialClass=document.querySelector(".serialNum");//返回第一个类名serialNum标签
var serialId=document.querySelector("#text1");//返回一个ID名为text1的标签
console.log(serialNum);
console.log(serialClass);
console.log(serialId);
</script>
</body>
</html>
</script>
6.querySelectorAll()获取选择器的所有有关标签
语法格式为:querySelectorAll() 返回的是一个NodeList;
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
</head>
<body>
编号:<input type="text" name="text" class="serialNum" >
密码:<input type="password" name="text" class="serialNum"id="text1">
姓名:<input type="text" name="text" class="serialNum">
<p class="text">广州好迪</p>
<script type="text/javascript">
var serialNum=document.querySelectorAll("input");//返回一个集合类数组
//通过遍历的方式拿到每一个input标签
for(var i=0;i<serialNum.length;i++){
console.log(serialNum[i]);
}
var serialClass=document.querySelectorAll(".serialNum");
console.log(serialClass);
</script>
</body>
</html>
</script>
DOM 对象节点属性
在DOM中,通过使用节点属性可以对各节点进行查询,查询各节点得名称、类型、属性、节点值、子节点和兄弟节点等。
先给大家讲一下这个父节点 和子节点
注意:
1.子节点只能获取直接子节点而不能获取间接子节点(很简单的例子,爷爷辈的直接子节点就是爸爸 而爸爸的儿子就不属于直接子节点)
2.子节点当然也具有他自己的子节点属性(父子节点是比较类似的)
3. fristChild-lastChild返回当前节点的第一个子节点和最够一个子节点(在DOM中文本也算一个节点)
//在当前文档中
//head得父节点就是HTML P标签得父节点就是DIV 而最大得父节点就是document
//html得子节点呢 就是head body 获取不到head中的title等标签
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript">
window.onload=function(){
var oDiv=document.getElementById('box');
oDivSon=oDiv.childNodes;
console.log(oDivSon);//在控制台输出oDiv下的所有子节点
}
</script>
</head>
<body>
<div id="box">
<div id="box1">
<p>hello,word</p>
</div>
</div>
</body>
</html>
接下来是咱兄弟节点(跟咱们生活中的兄弟节点是一样的,两个相领的标签)
还是上面的例子
body和head标签就是兄弟元素,兄弟节点跟父子节点一样只能获取直接兄弟节点。
例子1
在以下例子中大家会发现 第一个直接子节点的值为#text,这是一个文本节点,子节点包括(文本节点、元素节点等)
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<!-- Demo树 -->
<div class="two">
<p>11</p>
<p>22</p>
</div><div id="one">
<p><span>测试1</span></p>
<p><span>测试2</span></p>
<p><span>测试3</span></p></div>
<div id="three">
<span>321</span>
</div>
<!-- 例子 -->
<script type="text/javascript">
var one=document.getElementById("one");
console.log(one.firstChild);//返回当前节点的一个子节点
console.log(one.lastChild);//返回当前节点的最后一个子节点
console.log(one.previousSibling);//返回当前节点的前一个兄弟节点
var one1=one.nextSibling.nextSibling;
one1.style.backgroundColor="red";//设置one1的背景色
console.log(one1);//返回当前节点的后一个节点
cs=one.childNodes;//获取子节点
cs[1].innerText='bbb';
console.log(cs[1]);
</script>
</body>
</html>
children()
通过上面的例子我们会发现元素的直接子节点会包括文本节点,而使用children()方法返回的是元素节点不包括文本节点。
创建元素节点,添加元素节点
语法格式为:document.createElement();来创建元素节点
自然我们创建了一个元素节点同时也需要我们把他添加到相应的位置
添加元素节点语法格式:obj.appendChild();
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript">
window.onload=function () {
var oDiv=document.getElementById('box');
var span=document.createElement("span");//创建一个span标签
span.innerHTML="javascript";//设置span标签中的值为javascript
oDiv.children[0].appendChild(span);//将span添加到oDiv下的第一个元素节点
}
</script>
</head>
<body>
<div id="box">
<div>
<p>hello,word</p>
</div>
</div>
</body>
</html>
插入节点
插入节点 通过使用insertBefore()方法来实现。insertBefore()方法将新的子节点添加到当前节点的末尾。
其语法格式为:
obj.insertBefore(new,ref)
new:表示新得子节点
ref:指定一个节点,在这个节点前插入新得节点。
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
</head>
<body>
<ul id="test">
<li>JavaScript</li>
<li>HTML</li>
</ul>
<script type="text/javascript">
var otest = document.getElementById("test");
var oLi=document.createElement("li");
oLi.innerHTML="php";
alert(otest.children[1]);
otest.insertBefore(oLi,otest.children[1]);
</script>
</body>
</html>
删除节点
删除节点通过使用removeChild方法来实现。其语法格式如下
obj.removeChild(olChild)
olChild:表示需要删除的节点
运行结果为:
HTML
删除节点的内容: javascript
替换元素节点
替换元素节点可以使用replaceChild方法来实现。语法格式如下
obj.replaceChild(new,old)
new:替换后的新节点
old:需要被替换的旧节点
效果: 将文档中的 Java 改为 JavaScript。
注意:
- 当 oldnode 被替换时,所有与之相关的属性内容都将被移除。
- newnode 必须先被建立