1. DOM简介
前端JavaScript,经常提到的一个词就是DOM,DOM操作,初听是一团雾水,有的干了好几年前端,也不知道DOM是个啥。DOM是单词document object model的首字母,按照三个单词的翻译就是:文档对象模型。是一种标准,符合这个标准,就可以称为文档对象模型。如果文档是XML,就可以叫XML DOM;如果文档是HTML,就可以叫HTML DOM。DOM是标准,方法论,抽象的,HTML DOM是具体实现。
2. HTML DOM
DOM,根据英文单词翻译是文档对象模型,HTML固然就是叫HTML文档。HTML DOM定义了对HTML文档里元素的操作(增删改查)。
2.1 节点
根据DOM,HTML文档中的每个成分都是一个节点。整个HTML文档是一个文档节点,每个HTML标签是一个元素节点,每个HTML标签上的属性是一个属性节点,每个HTML标签中的文本是文本节点。
2.2 获取元素节点
一个HTML文档中,如果找到想要找的元素节点后,其元素的属性节点、文本节点也能找到了。下面介绍几种找到元素节点的方法。
getElementById()
通过元素id来找到其对应的元素。一个HTML文档,id是唯一的,如果出现两个一样的id会报错。用此种方法找到的是该HTML文档中唯一的元素。
语法:
document.getElementById("id名")
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oH1 = document.getElementById("title")
console.log(oH1)
}
</script>
</head>
<body>
<h1 id="title">前程似紧</h1>
</body>
</html>
解析:
通过F12控制台打印,JavaScript确实通过元素的id属性名找到了其元素。定位到了该元素,就可以给该元素增删改查元素或增删改查属性节点、文本节点。这是后话,这里先不展开说。
getElementsByTagName()
通过元素名(标签名、标记,说的都是一回事)找到元素。就像通过姓名找马冬梅,可能存在重名,不能确定唯一性。
语法:
document.getElementsByTagName('标签名')
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.getElementsByTagName('p')
console.log(oP)
}
</script>
</head>
<body>
<p>手头紧</p>
<p>眉头紧</p>
</body>
</html>
解析:
getElementsByTagName()方法获取的是一个集合,即使整个HTML文档只获取到符合条件的元素。
getElementsByClassName()
通过类名找到元素。一个HTML文档,相同类名可以存在不同元素上,通过类名找到的是一个集合。
语法:
document.getElementsByClassName('类名')
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oTmp = document.getElementsByClassName('tmp')
console.log(oTmp)
}
</script>
</head>
<body>
<div class="tmp">手头紧</div>
<p class="tmp">眉头紧</p>
</body>
</html>
解析:
getElementsByClassName()方法同通过标签名获取元素一样,结果是一个集合,即使整个HTML文档只获取到符合条件的元素。
querySelector()
通过类似CSS选择器方式获取第一个满足条件的元素。
语法:
document.querySelector('选择器')
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oTmp = document.querySelector('div.tmp')
console.log(oTmp)
}
</script>
</head>
<body>
<div class="tmp">手头紧</div>
<p class="tmp">眉头紧</p>
</body>
</html>
document.querySelectorAll()
通过类似CSS选择器方式获取所有满足条件的元素,结果集可以理解为一个数组。
语法:
document.querySelectorAll('选择器')
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oTmp = document.querySelectorAll('.tmp')
console.log(oTmp)
}
</script>
</head>
<body>
<div class="tmp">手头紧</div>
<p class="tmp">眉头紧</p>
</body>
</html>
解析:
document.querySelectorAll()方法获取的是一个结果集。
getElementsByName()
form表单中,可以通过元素name属性值方式获取该,存在单选框、多选框的情况,结果也是一个集合。
语法:
document.getElementsByName('属性值')
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oRadio = document.getElementsByName('radio')
console.log(oRadio)
}
</script>
</head>
<body>
<input type="text" name="radio" value="男">
<input type="text" name="radio" value="女">
</body>
</html>
document.title
一个HTML文档只有一个title元素,所以不用
document.getElementsByTagName、document.querySelector等方式获取元素,直接操作即可
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
document.title = 'China'
}
</script>
</head>
<body>
</body>
</html>
document.body
一个HTML文档只有一个body元素,所以不用
document.getElementsByTagName、document.querySelector等方式获取元素,直接操作即可
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
document.body.style.backgroundColor = 'gray'
}
</script>
</head>
<body>
</body>
</html>
2.3 创建元素节点
通过上节获取元素节点知识,我们可以获取HTML文档中任一元素。如上图,我们想往id=content的div元素添加子元素。首先我们得创建一个元素,其次插入进去。元素节点中还得有属性节点、文本节点。
创建元素节点
语法:
document.createElement('标签名')
示例:
var oP = document.createElement('p');
创建文本节点
语法:
document.createTextNode('文本内容')
示例:
var oTxt = document.createTextNode('前程似紧');
文本节点插入元素节点中
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
// 创建元素节点
var oP = document.createElement('p');
// 创建文本节点
var oTxt = document.createTextNode('前程似紧');
// 文本节点插入元素节点中
oP.appendChild(oTxt)
console.log(oP)
}
</script>
</head>
<body>
</body>
</html>
添加属性节点
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
// 创建元素节点
var oP = document.createElement('p');
// 创建文本节点
var oTxt = document.createTextNode('前程似紧');
// 文本节点插入元素节点中
oP.appendChild(oTxt)
// 添加类属性
oP.className = 'test'
// 添加样式属性
oP.style.color = 'red'
console.log(oP)
}
</script>
</head>
<body>
</body>
</html>
解析:
在JavaScript中class是关键字,所以在这里className来替代class。
2.4 插入元素节点
获取元素节点已经可以定位HTML文档中某个具体位置了,创建元素节点已经可以创建某个具体元素了(包含文本节点、属性节点)。创建元素节点得插入到获取到的元素节点位置上。
appendChild()
子节点尾部添加元素。
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
// 创建元素节点
var oP = document.createElement('p');
// 创建文本节点
var oTxt = document.createTextNode('前程似紧');
// 文本节点插入元素节点中
oP.appendChild(oTxt)
// 获取元素节点
var oDiv = document.getElementById('content');
oDiv.appendChild(oP)
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
</div>
</body>
</html>
insertBefore()
指定子节点头部添加元素
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
// 创建元素节点
var oP = document.createElement('p');
// 创建文本节点
var oTxt = document.createTextNode('前程似紧');
// 文本节点插入元素节点中
oP.appendChild(oTxt)
// 获取元素节点
var oDiv = document.getElementById('content');
oDiv.insertBefore(oP, oDiv.firstElementChild)
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
</div>
</body>
</html>
2.5 复制元素节点
可以从零创建一个元素节点,也可以从现有的元素节点复制一个元素节点,这可以理解是另外一种创建元素节点的方式。
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
var oClone = oP.cloneNode(true)
// 获取元素节点
var oDiv = document.getElementById('content');
oDiv.appendChild(oClone)
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
</div>
</body>
</html>
2.6 删除元素节点
元素节点能增,肯定也可以删
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oMe = document.querySelector('.me');
// 获取元素节点
var oDiv = document.getElementById('content');
oDiv.removeChild(oMe)
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
<p class="me">me,it's me</p>
<p>me,it's me</p>
</div>
</body>
</html>
解析:
能定位到元素节点,就肯定有方法可以删掉它。
2.7 替换元素节点
增删改查操作,就像卧龙凤雏一般都是一起出现的。这里替换元素节点的方法相当于改操作。
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oMe = document.querySelector('.me');
var oP = document.createElement('p');
var oTxt = document.createTextNode('我,是我');
oP.appendChild(oTxt)
// 获取元素节点
var oDiv = document.getElementById('content');
oDiv.replaceChild(oP, oMe)
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
<p class="me">me,it's me</p>
<p>me,it's me</p>
</div>
</body>
</html>
3. 创建元素节点
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
// 创建元素节点
var oP = document.createElement('p');
// 创建文本节点
var oTxt = document.createTextNode('前程似紧');
// 文本节点插入元素节点中
oP.appendChild(oTxt)
console.log(oP)
}
</script>
</head>
<body>
</body>
</html>
分析:
示例方式创建元素节点比较麻烦,元素比较多,操作起来比较难受。
3.1 innerHTML
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oDiv = document.getElementById('content');
oDiv.innerHTML = "<p>me,it's me</p>"
}
</script>
</head>
<body>
<div id="content">
</div>
</body>
</html>
分析:
用innerHTML方式完成一个完整的的元素节点(可以包含属于节点、内容节点)设置。同时也可以用obj.innerHTML方式获取对象完整元素节点。
3.2 innerText
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oDiv = document.getElementById('content');
oDiv.innerText = 'hello world'
}
</script>
</head>
<body>
<div id="content">
</div>
</body>
</html>
分析:
用obj.innerText方式设置的是内容节点,即使加了标签也会被当成文本内容,浏览器不解析。同时也可以用obj.innerText方式获取内容节点。
4. 属性节点操作
属性分为HTML属性和CSS属性。HTML属性是HTML中元素带有的属性,比如name、src、value等;CSS属性是层叠样式的属性,比如style、background等
4.1 HTML属性
获取HTML属性值
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oMe = document.querySelector('.me');
console.log("class = " + oMe.className)
}
</script>
</head>
<body>
<div id="content">
<p class="me">me,it's me</p>
</div>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oMe = document.querySelector('.me');
console.log("class = " + oMe.getAttribute('class'))
}
</script>
</head>
<body>
<div id="content">
<p class="me">me,it's me</p>
</div>
</body>
</html>
解析:
获取HTML属性值可以通过obj.属性名或者obj.getAttribute('属性名')的方式获取
设置HTML属性值
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
oP.className = 'me'
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
</div>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
oP.setAttribute('class', 'me')
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
</div>
</body>
</html>
分析:
设置HTML属性值可以通过obj.属性名=属性值或者obj.setAttribute('属性名','属性值')的方式设置
移除HTML属性
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
oP.removeAttribute('class')
}
</script>
</head>
<body>
<div id="content">
<p class="me">me,it's me</p>
</div>
</body>
</html>
解析:
HTML属性的移除通过obj.removeAttribute('属性名')
判断含有HTML某属性
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
if (oP.hasAttribute('class')) {
console.log('yes')
} else {
console.log('no')
}
}
</script>
</head>
<body>
<div id="content">
<p class="me">me,it's me</p>
</div>
</body>
</html>
4.2 CSS属性
获取CSS属性
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
// console.log(getComputedStyle(oP)['color'])
console.log(getComputedStyle(oP).color)
}
</script>
</head>
<body>
<div id="content">
<p style="color: red">me,it's me</p>
</div>
</body>
</html>
分析:
getComputedStyle(obj)['属性名']或者getComputedStyle(obj).属性名的方式获取CSS属性值
设置CSS属性
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
oP.style.color = 'red'
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
</div>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
oP.style.cssText = 'color:red'
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
</div>
</body>
</html>
分析:
CSS属性值的设置可以通过obj.style.属性名=属性值或obj.style.cssText='属性名:属性值;...',后者可以同时设置多个CSS属性
5. 查找元素节点
定位到某个元素节点,这个时候业务有需要找其父节点、兄弟节点、子节点
5.1 父节点
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
var oParent = oP.parentNode
console.log(oParent)
}
</script>
</head>
<body>
<div id="content">
<p>me,it's me</p>
</div>
</body>
</html>
分析:
obj.parentNode获取父节点
5.2 兄弟节点
previousSibling(查找前一个兄弟节点)、nextSibling(查找后一个兄弟节点)、previousElementSibling(查找前一个兄弟元素节点)、nextElementSibling(查找后一个兄弟元素节点)。
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oP = document.querySelector('p');
var oPn = oP.nextElementSibling
console.log(oPn)
}
</script>
</head>
<body>
<div id="content">
<p>我,是我</p>
<p>me,it's me</p>
</div>
</body>
</html>
分析:
一般是查找其兄弟元素节点,只要找到其兄弟元素了,其属性、其文本都好办了。
5.3 子节点
childNodes(所有子节点)、firstChild(第一个子节点)、lastChild(最后一个子节点)、children(所有元素节点)、firstElementChild(第一个子元素节点)、lastElementChild(最后一个子元素节点)
示例:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
window.onload = function () {
var oDiv = document.querySelector('#content');
var oChidren = oDiv.children
console.log(oChidren)
}
</script>
</head>
<body>
<div id="content">
<p>我,是我</p>
<p>me,it's me</p>
</div>
</body>
</html>
分析:
一般是查找子元素节点,只要找到其子元素了,其属性、其文本都好办了。
本文来自投稿,作者:p2p信息资源网,不代表p2p信息资源网立场!如有侵权,联系管理员:202348182@qq.com删除