DOM
什么是DOM:
DOM(文档对象模型):document object model。
DOM 是document object model 它是W3C产业联盟制定的浏览器对程序员提供的对HTML文档操作的接口
把文档中的代码翻译成一个对象模型
在这个模型中 所有相关的标签属性注释文本等等12种数据 都翻译为一种类型的对象 统称节点对象
这些对象之间在文档模型数据结构中存在某种关系: 根节点 父子节点 同胞节点等等
1.只有一个根节点document
2.除了根节点外所有节点都有唯一的一个父节点
3.document是window对象的属性
4.全局对象模型属于BOM操作 Browser Object Model 把浏览器对外提供的接口翻译为一个对象 BOM操作会在接下来的知识点讲到 它不属于标准的接口 但是浏览器厂商都提供了几乎一样的功能 5.元素的属性也是独立节点 叫属性节点 但是不是元素节点的子节点
获取元素
1.通过方法获取节点
旧方法:
通过id查找:document.getElementById 查找速度最快。返回标签对象或者null
通过类名查找:document.getElementsByClassName//返回类数组(装的元素)/空类数组
通过name查找:document.getElementsByName//返回类数组(装的元素)/空类数组
通过标签名查找:document.getElementsByTagName//返回类数组(装的元素)/空类数组
<body>
<nav class="2">222</nav>
<div id="1">
1111
</div>
<input type="text" name="3">
<table>
<tr>
<td></td>
</tr>
</table>
</body>
<script>
var re1 = document.getElementById("1");
var re2 = document.getElementsByClassName("2")
var re3 = document.getElementsByName("3")
var re4 = document.getElementsByTagName("table")
console.log(re1, re2, re3, re4);
</script>
H5出的新方法:
通过选择器选择查找:返回一个类数组
document.querySelector//通过选择器进行查询,选取符合条件的第一个,没有就返回【】
document.querySelectorAll//通过选择器进行查询,获取所有符合条件的,没有就返回【】
<body>
<nav class="2">222</nav>
<nav>3333</nav>
<nav>3333</nav>
<nav>3333</nav>
<nav>3333</nav>
<div id="1">
1111
</div>
<div>
3333
</div>
<div>
44444
</div>
</body>
<script>
var re1 = document.querySelector("div");
var re2 = document.querySelectorAll("nav")
console.log(re1);
</script>
系统提供的直接获取的方式(除了body不常用):
body标签:document.body
form表单们:document.forms
a标签们:document.anchors
图片们:document.images
连接们:document.links
当前文档的网址:document.URL
通过关系获取节点
节点与元素的区别:
节点: 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:
-
整个文档是一个文档节点
-
每个 HTML 元素是元素节点
-
HTML 元素内的文本是文本节点
-
每个 HTML 属性是属性节点
-
注释是注释节点
元素:元素是特定类型的节点 element (Node.ELEMENT_NODE),以及文档、注释、文本等类型。
简而言之,元素是使用HTML文档中的标记编写的节点。 html,head,title,body,h2,p都是元素,因为它们由标签表示。
通过关系获取元素:
<body>
<div id="box1">hello
<div class="box2" id="box4">2</div>
<div class="box2">
<div class="box3" id="box5">box3</div>
</div>
<div class="box2" id="box6">4</div>
</div>
<script>
var box4 = document.querySelector("#box4")
//爸爸
var box4baba = box4.parentElement
console.log(box4baba)
var box5 = document.querySelector("#box5")
// console.log(box5.parentElement.parentElement.parentElement.parentElement.parentElement)
console.log(box5.parentNode.parentNode.parentNode.parentNode.parentNode)
// 子节点
var box4 = document.querySelector("#box1")
var arr = box4.children //子元素们
var arr2 = box4.childNodes //子节点们
console.log(arr, arr2)
var box = document.querySelector("#box4")
console.log(box.children, 111)
// 弟弟节点
var box = document.querySelector("#box4")
console.log(box.nextElementSibling) //弟弟元素
console.log(box.nextSibling) //弟弟节点
var box6 = document.querySelector("#box6")
console.log(box6.nextElementSibling) //弟弟元素
console.log(box6.nextSibling) //弟弟节点
// 哥哥节点
var box = document.querySelector("#box4")
console.log(box.previousElementSibling) //弟弟元素
console.log(box.previousSibling) //弟弟节点
var box6 = document.querySelector("#box6")
console.log(box6.previousElementSibling) //哥哥元素
console.log(box6.previousSibling) //哥哥节点
// 第1个子元素
var box = document.querySelector("#box4")
console.log(box.firstElementChild) //第1个子元素
console.log(box.firstChild) //第1个子节点
// 最后一个子元素
var box = document.querySelector("#box4")
box.children[box.children.length - 1]
box.childNodes[box.childNodes.length - 1]
console.log(box.lastElementChild) //最后一个子元素
console.log(box.lastChild) //最后一个子节点
检索子元素是父元素中的第几个:
封装一个函数
Object.prototype.indexof1 = function () {
var arr = this.parentElement.children
for (let i = 0; i < arr.length; i++) {
if (arr[i] === this) {
return i
}
}
}
var box = document.querySelector("#box6")
console.log(box.indexof1())
元素的操作
操作元素
JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容 、属性等。注意以下都是属性
1、改变元素内容
innerText
从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉。
element.innerText
innerHTML
起始位置到终止位置的全部内容,包括HTML标签,同时保留空格和换行
element.innerHTML
<body>
<div></div>
<p>
我是文字
<span>123</span>
</p>
<script>
// innerText 和 innerHTML的区别
// 1. innerText 不识别html标签,去除空格和换行
var div = document.querySelector('div');
div.innerText = '<strong>今天是:</strong> 2019';
// 2. innerHTML 识别html标签 保留空格和换行的
div.innerHTML = '<strong>今天是:</strong> 2019';
// 这两个属性是可读写的 可以获取元素里面的内容
var p = document.querySelector('p');
console.log(p.innerText);
console.log(p.innerHTML);
</script>
</body>
分析:innerText 不识别html标签,去除空格和换行,因此在页面上显示strong标签,在控制台上不打印span标签
2、改变元素属性
// img.属性
img.src = "xxx";
input.value = "xxx";
input.type = "xxx";
input.checked = "xxx";
input.selected = true / false;
input.disabled = true / false;
3、改变样式属性
我们可以通过 JS 修改元素的大小、颜色、位置等样式。
- 行内样式操作
// element.style
div.style.backgroundColor = 'pink';
div.style.width = '250px';
- 类名样式操作
// element.className
**注意 **:
-
JS里面的样式采取驼峰命名法,比如 fontSize ,backgroundColor
-
JS 修改 style 样式操作 ,产生的是行内样式,CSS权重比较高
-
如果样式修改较多,可以采取操作类名方式更改元素样式
-
class 因为是个保留字,因此使用className来操作元素类名属性
-
className 会直接更改元素的类名,会覆盖原先的类名
<body>
<div class="first">文本</div>
<script>
// 1. 使用 element.style 获得修改元素样式 如果样式比较少 或者 功能简单的情况下使用
var test = document.querySelector('div');
test.onclick = function() {
// this.style.backgroundColor = 'purple';
// this.style.color = '#fff';
// this.style.fontSize = '25px';
// this.style.marginTop = '100px';
// 让我们当前元素的类名改为了 change
// 2. 我们可以通过 修改元素的className更改元素的样式 适合于样式较多或者功能复杂的情况
// 3. 如果想要保留原先的类名,我们可以这么做 多类名选择器
// this.className = 'change';
this.className = 'first change';
}
</script>
</body>
4、总结
排他思想
如果有同一组元素,我们相要某一个元素实现某种样式,需要用到循环的排他思想算法:
-
所有元素全部清除样式(干掉其他人)
-
给当前元素设置样式 (留下我自己)
-
注意顺序不能颠倒,首先干掉其他人,再设置自己
案列:点击一列变色,其他列不变色
<body>
<style>
table {
border: 1px red solid;
}
tr {
width: 100%;
height: 40px;
}
td {
width: 100px;
border: 1px darkred solid;
}
</style>
<table id="tb" cellspacing="0">
<tr>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
</tr>
<tr>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
</tr>
<tr>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
</tr>
<tr>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>hello</td>
</tr>
</table>
<script>
Object.prototype.indexof1 = function () {
var arr = this.parentElement.children
for (let i = 0; i < arr.length; i++) {
if (arr[i] === this) {
return i
}
}
}
</script>
<script>
var tb = document.querySelector("#tb")
var trs = document.querySelectorAll("tr")
var tds = document.querySelectorAll("td")
console.log(tds)
for (let i = 0; i < tds.length; i++) {
tds[i].onclick = function () {
// console.log(this,tds[i])
//1.把所有的td的背景颜色设置为白色
//2.获取当前点击的元素是一横排中的第x个元素
//3.把没一横排的第x个元素 设置为red
//排它思想
tds.forEach((el) => {
// console.log(el,11)
el.style.backgroundColor = "white"
})
let x = tds[i].indexof1()
trs.forEach((el) => {
//el是tr元素
el.children[x].style.backgroundColor = "red"
})
}
}
</script>
</body>