第七章:DOM模型一
DOM(Document Object Model):文档对象模型对文档的结构化的表述定义了在程序中对该结构进行访问的方式DOM 分类核心 DOM:用于任何结构化文档的标准模型定义了与系统平台和编程语言无关的接口,DOM 是一种 APIHTMLDOM:用于 HTML 文档的标准模型XMLDOM:用于 XML 文档的标准模型DOM 作用访问文档内容,包括元素、属性、文本增...
DOM(Document Object Model):文档对象模型
对文档的结构化的表述
定义了在程序中对该结构进行访问的方式
DOM 分类
核心 DOM:用于任何结构化文档的标准模型
定义了与系统平台和编程语言无关的接口,DOM 是一种 API
HTML DOM:用于 HTML 文档的标准模型
XML DOM:用于 XML 文档的标准模型
DOM 作用
访问文档内容,包括元素、属性、文本
增加文档内容,包括元素、属性、文本
删除文档内容,包括元素、属性、文本
修改文档内容,包括元素、属性、文本
DOM 的应用十分广泛,各种网页特效均有 DOM 的踪影
DOM 树
DOM 将 HTML 文档抽象为树形结构,称这棵树为 DOM 树
HTML 中的每一项内容都可以在 DOM 树中找到
对文档内容的操作即对 DOM 树的操作
HTML 文档中的所有内容都是节点:
是根节点,其他标签都是元素,属性是属性。 ① 整个文档是一个文档节点 ; ② 每个 HTML 元素是元素节点 ; ③ HTML 元素内的文本是文本节点 ,回车也是文本节点; ④ 每个 HTML 属性是属性节点 ; ⑤ 注释是注释节点 ;DOM 节点是一个对象,拥有属性和方法
元素节点
HTML 开始标签中的属性为元素节点对象的属性
HTML 开始标签中的事件属性为元素节点对象的方法
元素节点对象中的方法函数中的 this 指向当前触发事件的元素
属性节点
文本节点
空格、换行空格属于文本节点
<body>
<div id="contianer">
</div>
</body>
<!-- lastchild-->
<script>
//得到一个元素的节点
var contianer=document.getElementById("contianer")
//事件也可以看成一个特殊的属性
//在对象的方法内部,this指向当前对象
//DOM对象的回调函数内部,this指向当前对象
contianer.onclick=function(){
console.log(this.id);
}
console.log(contianer);
</script>
元素树
在节点树中,顶端节点被称为根(root)
父节点: 每个节点都有父节点、除非该元素是文档的根节点
子节点: 每个元素节点可以有 0 个、1 个或多个子节点
同胞节点: 指拥有相同父节点的节点
JavaScript 解释器会为载入的每个 HTML文档创建一个对应的document 对象
通过使用 document对象,可以从脚本中对 HTML 页面中的所有节点进行访问
获取节点的方式:
直接获取:
通过ID属性获取节点
通过标签名获得所有的同名节点
通过类名获取所有相同类名的标签
通过节点关系获取
通过父节点获取子节点
通过子节点获得父节点
获得前后兄弟节点
//第一个单词首字母小写,其余单词首字母大写(小驼峰命名法)
通过 id 属性获得节点(ID选择器)
document.getElementById( )
通过标签名获得所有同名标签(标签选择器)
document.getElementsByTagName( )
返回值是数组,用时注意带上角标
通过类名获得所有类名相同的标签(类选择器)
document.getElementsByClassName( )
var arr=["welcome","to the","westworld"];
var pList=document.getElementsByTagName("p");
for(var num=0;num<pList.length;++num)
{
//双标记标签可以使用这个属性
pList[num].innerHTML=arr[num];
}
document.documentElement 返回 HTML 文档中元素
document.head 返回 HTML 文档中元素
document.body 返回 HTML 文档中元素
<body>
<div id="container">
<p id="p1">这是一个段落</p>
</div>
</body>
<script>
p1.onclick = function() {
container.replaceChild(hNode, p1);
}
</script>
- childNodes 属性——返回节点的子节点集合。之后可以通过循环或者索引找到需要的元素节点。
例:document.getElementById(“myList”).childNodes;
document.getElementById(“myList”).childNodes[0]; - children 属性——返回节点的所有元素子节点集合。
例:document.getElementById(“myList”).children;
document.getElementById(“myList”).children[0];
DOM对象。chilnodes表示子节点的集合(子节点对象),包括空格,注释,实际网页元素
children,获取具体的元素子节点对象的集合,不包含空格与注释
-
firstChild 属性——返回指定节点的首个子节点。可递归使用,即支持 parentObj.firstChild.firstChild… 的形式,如此可获得更深层次的节点。
例:document.getElementById(“myList”).firstChild; -
firstElementChild 属性——返回指定节点的首个元素子节点。
例:document.getElementById(“myList”).firstElementChild; -
lastChild 属性——返回指定节点的最后一个子节点。可递归使用,即支持 parentObj.lastChild.lastChild… 的形式,如此可获得更深层次的节点。
例:document.getElementById(“myList”).lastChild; -
lastElementChild 属性——返回指定节点的最后一个元素子节点
例:document.getElementById(“myList”).lastElementChild;
parentNode 属性——返回指定节点的父节点
parentElement 属性——返回指定节点的父节点
html代码:
<h1>新闻动态<span id="time">2018-10-7</span></h1>
js代码:
var parent= document.getElementById("time").parentNode;
console.log(parent.innerHTML);
输出结果:
新闻动态<span id="time">2018-10-7</span>
-
previous(Element)Sibling 属性——返回指定节点紧跟的前一个(元素)兄弟节点。
例:document.getElementById(“item1”).previousSibling; -
next(Element)Sibling 属性——返回指定节点之后紧跟的一个(元素)兄弟节点
例:document.getElementById(“item2”).nextSibling -
innerHTML 属性
innerHTML 是 DOM 中元素节点的属性,相当于一个容器
用于获取或改变任意元素节点的内容,该属性可读可写
操作简单,几乎所有浏览器均支持 innerText 属性
<body>
<ul id="list">
<li class="bg">香蕉</li>
<li class="bg">苹果</li>
<li class="bg">橘子</li>
</ul>
</body>
<script>
var list=document.getElementById("list");
list.innerHTML="<h1>这是标题</h1>"//会解析内容
list.innerText="<h1>这是标题</h1>";//不解析内容
//这是标题
//<h1>这是标题</h1>
console.log(list.innerText);//过滤标记,纯文本
</script>
-
textContent 属性//有缺陷,不使用
-
读取元素节点内容
var txt = document.getElementById(“intro”).innerHTML;
document.write(txt); -
修改元素节点内容
document.getElementById(“intro”).innerHTML = “hello”; -
获取某一元素节点的属性
node.getAttribute( attrName ) -
设置某一元素节点的属性
node.setAttribute( attrName,value )
当属性存在时,为修改相应属性值
当属性不存在时,为添加相应属性 -
删除某一元素节点的属性
node.removeAttribute( attrName ) -
判断某一元素节点是否含有某属性
node.hasAttribute( attrName )
返回值为布尔值 true/false
设置节点属性 当属性不存在时,添加相应属性
three.setAttribute("class", "red");
当属性存在时,为修改相应属性值
three.setAttribute("class", "green");
var btn2=document.getElementById("btn2");
btn2.onclick=function(){
this.parentNode.firstElementChild.removeAttribute("class");//移除class属性
}
btn2.onclick=function(){
var isExist=this.parentNode.firstElementChild.hasAttribute("class");//判断是否有class
console.log(isExist);//返回判断结果
if(isExist==true)
{
this.parentNode.firstElementChild.removeAttribute("class");//移除class属性
}
}
DOM 操作注意事项:
获取 DOM 节点的操作要在被浏览器加载之后进行
<script>标签放在 HTML 内容后面,即<body>结束标签前面
通用性强,几乎所有浏览器均支持
操作比较复杂,书写代码量过大
DOM 节点、DOM 树与元素树
访问 DOM 元素节点的方式
直接访问
间接访问
特殊节点访问
元素节点的属性操作
增、删、改、查、判断方法
元素节点的文本内容操作 —— innerHTML
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>综合练习</title>
<style>
body {
padding: 50px;
}
td {
width: 100px;
}
</style>
</head>
<body>
<table id="tab" border="1" cellspacing="0">
<tr>
<td>
<button>删除本行0</button>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<button>删除本行1</button>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<button>删除本行2</button>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<button>删除本行3</button>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<button>删除本行4</button>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<button>删除本行5</button>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<button>删除本行6</button>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
<button>删除本行7</button>
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
<script>
//效果:点击按钮,删除按钮所在行
var button = document.getElementsByTagName("button"); //类似数组
var tab = document.getElementById('tab')
for (var i = 0; i < button.length; i++) { //遍历类似数组
button[i].onclick = function() {
// this.parentNode.parentNode.innerHTML = "";
tab.children[0].removeChild(this.parentNode.parentNode)
}
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
body {
padding: 50px;
}
#div {
display: inline-flex;
flex-wrap: wrap;
}
.circle {
width: 100px;
height: 100px;
margin: 15px;
border-radius: 50%;
}
</style>
</head>
<body>
<div id="div">
<div class="circle" style="background:rgba(100,100,200,0.4)"></div>
</div>
<script>
//效果:点击桌面圆,然后添加一个随机颜色的圆
//第一步:随机颜色函数
function color() {
var r = parseInt(Math.random() * 255);
var g = parseInt(Math.random() * 255);
var b = parseInt(Math.random() * 255);
var a = Math.random() * 0.7 + 0.3;
//a = a.toFixed(2) //保留两位小数
var rgba = "rgba(" + r + "," + g + "," + b + "," + a + ")";
return rgba;
}
//第二步:添加随机颜色圆函数
function circle(that) {
that.innerHTML += '<div class="circle" style="background:' + color() + '"></div>';//字符串拼接
}
//第三步:为div绑定函数功能
var div = document.getElementById("div");
div.setAttribute("onclick", "circle(this)");
</script>
</body>
</html>
<body>
<p>我喜欢的水果:</p>
<ul id="fruit">
<li>百香果</li>
<li>山竹</li>
<li class="three">火龙果</li>
<li>猕猴桃</li>
</ul>
<p>我喜欢的动物:</p>
<ul id="animal">
<li>小猴子</li>
<li>狮子</li>
<li class="three">小猪</li>
<li>大熊猫</li>
</ul>
<script>
//类似数组对象 具有长度属性,可以遍历,但不是真正的数组,不具有数组的方法
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Typed_arrays
//类似数组对象遍历
var p = document.getElementsByTagName("p");//返回类似数组对象
for (var i = 0; i < p.length; i++) {
document.write(p[i].innerHTML)
document.write("<br/>");
}
</script>
更多推荐
所有评论(0)