JS进阶(二)DOM
1.DOM (Document Object Model)文档对象模型
js中对象的分类有三种:
- 用户定义对象
- 内建对象 Array Date Math等
- 宿主对象(由浏览器创建的对象)
model map
可以将DOM看成一棵“树”。DOM 把文档看做一棵家谱树,parent、child、sibling等。
整个html文档,会保存一个文档对象document。
2.DOM中的节点
- 元素节点 element node
- 文本节点 text node 没有内容的文档没有任何价值,而大多数内容都是由文本提供
- 属性节点 attribute node 比如<p title='xxx' id='xx'> 这里的title什么的
2.1 获取元素节点的方式
- document.getElementById() 单个对象,最后结果是个Object
- document.getElementsByTagName 多个对象,最后结果是个HTMLCollection,集合,有点像数组push
- document.getElementsByClassName 多个对象,最后结果是个HTMLCollection,集合
<ul id="classlist">
<li class="item">js</li>
<li class="item">css</li>
<li>DOM</li>
</ul>
<script>
// 1.document.getElementById() 单个对象,最后结果是个Object
var eleNode = document.getElementById('classlist') // 获取出来是个对象哦,object
// 2.document.getElementsByTagName 多个对象,最后结果是个HTMLCollection,集合,有点像数组push
var objList = document.getElementsByTagName('ul')
// 3.document.getElementsByClassName 多个对象,最后结果是个HTMLCollection,集合
var oItems = document.getElementsByClassName('item')
</script>
2.2. setAttribute()和getAttribute()方法
<head>
/// .......
<style type="text/css">
#box{
color: red;
}
</style>
</head>
<body>
<p tilt="未设置的"> 嗨嗨嗨 </p>
<script>
var oP = document.getElementsByTagName('p')[0];
// 获取属性值xx.getAttribute,有一个必须的参数,这个节点对象的名字
var title = oP.getAttribute('title');
// 设置属性值xx.setAttribute(name,value),两个参数
oP.setAttribute('id','box')
// 注意:DOM工作方法:先静态加载文档的内容,再动态刷新DOM,动态刷新不会影响静态内容,加了这个id,也看不出来加了
cosole.log(title)
</script>
</body>
2.3 节点对象的单个重要属性介绍
- nodeName 节点名称
- nodeValue 节点的值
- nodeType 节点的类型
nodeName属性:节点的名称,是只读
- 元素节点的nodeName与标签名相同
- 属性节点的nodeName与属性的名称相同
- 文本节点的nodeName永远是#text
- 文档节点的nodeValue永远是#document
nodeValue属性:节点的值
- 元素节点的nodeValue是undefined或null
- 属性节点的nodeValue是属性的值
- 文本节点的nodeValue是文本自身
nodeType属性:节点的类型,是只读的(以下是几个常用的)
- 元素:节点类型是1
- 属性:2
- 文本:3
- 注释:8
- 文档:9
2.4 元素节点对象的增删改查方法
动态操作节点
- 创建节点 createElement()
- 插入节点 appendChild() insertBefore(newNode,node)
- 删除节点 removeChild()
- 替换节点 replaceChild(newNode,node)
- 创建文本节点 createTextNode()
3.样式设置
方法1(不推荐):
<body>
<p id="box">llll</p>
<script type="text/javascript">
var para = document.getElementById("box");
console.log(para.style)
para.style.color = 'white';
para.style.backgroundColor = 'red';
para.style.width='200px'
</script>
</body>
方法2:通过控制属性类名控制样式
<head>
<meta charset="utf-8">
<title>动态操作样式</title>
<style type="text/css">
.highlight{
background-color: red;
color: white;
width: 250px;
height: 250px;
text-align: center;
font-size: 30px;
}
</style>
</head>
<body>
<p id="box">llll</p>
<script type="text/javascript">
var para = document.getElementById("box");
para.setAttribute("class","highlight")
</script>
</body>
4.查找标签
4.1 直接查找 就是2.1小节的内容
- document.getElementById() 单个对象,最后结果是个Object
- document.getElementsByTagName 多个对象,最后结果是个HTMLCollection,集合,有点像数组push
- document.getElementsByClassName 多个对象,最后结果是个HTMLCollection,集合
4.2 导航查找标签
依赖我们标签的父子兄弟关系定位到我们的目标标签。
- elementNode.parentElement
- elementNode.children
- elementNode.firstElementChild
- elementNode.lastElementChild
- elementNode.nextang // 下一个兄弟标签
- elementNode.previousElementSibling //上一个兄弟标签
4.3 css选择器查找
document.querySelector("css选择器") // 根据cs选择器来获取查找到的第一个元素,返回标签对象(dom对象)
document.querySelectorAll("css选择器") // 根据css选择器来获取查找到的所有元素,返回数组
例:
document.querySelector(".c1 .c2 .c3") // 这样也只能返回第一个dom对象
document.querySelectorAll(".c1 .c2 .c3") // 这样可以返回三个元素的数组
5.绑定事件
- 静态绑定:直接把事件写在标签元素中。
- 动态绑定:在js中通过代码获取元素对象,然后给这个元素进行后续绑定。
静态绑定案例:实现点击一个内容,弹出点击的那个文本,借助了第6小部分的文本操作的知识点。
静态绑定用得很少,因为它的js代码和css代码揉在一起了,最好解耦。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script>
// 形参不能叫this哦,实参是this
function foo(self){
console.log(self);
var msg = self.innerHTML;
alert(msg)
}
</script>
</head>
<body>
<div onclick="foo(this)"> click </div>
</body>
</html>
动态绑定案例:
语法:
dom对象.on事件 = function(){
// 事件触发代码
}
注:事件函数中的this代指的是触发事件的标签
循环绑定:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="jquery-3.3.1.js"></script>
</head>
<body>
<ul class="lst">
<li>111</li>
<li>222</li>
<li>333</li>
</ul>
<script>
var eles = document.querySelectorAll(".lst li");
console.log(eles);
for (var i = 0; i < eles.length; i++) {
eles[i].onclick = function () {
// console.log(eles[i].innerHTML)
/* 不能这么写,这里经典的一个错误
for循环的时候仅仅是声明了这个匿名函数给这个时间,没有执行function里的代码、
等到点击执行的时候,i已经是for循环结束的时候的值了,也就是3
所以如果直接写这行代码,最终会报错
*/
console.log(this.innerHTML);
}
}
</script>
</body>
</html>
6.操作标签(重点)
<标签名 属性1="属性1值" 属性2="属性2值" ...> 文本 </标签名>
- 文本操作
- value操作 像input标签,select标签是没有文本的,但是显示内容由value属性决定。
- css样式操作
6.1 查询文本和设置文本:
- innerHTML
- innerText
都是属性,属性赋值直接用等于号"="。他俩处理标签内容的时候有差别,处理纯文本效果是一样的。
6.2 input标签的value操作
6.3 select标签和textarea的value操作
这两个其实都是蛮简单的,笔记我都没做,也是查询和赋值什么的,直接用。textarea是多行文本。
6.4 css样式操作
两种方式,直接操作属性 ;通过控制属性名来控制样式
直接操作就是 document对象.style.color什么的,就是style属性,后面自己配键值对什么的。
通过属性类名控制就是下面6.5 小节的内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>动态操作样式</title>
<style type="text/css">
.highLight{
background-color: black;
color: white;
width: 250px;
height: 250px;
line-height: 250px;
text-align: center;
font-size: 30px;
}
</style>
</head>
<body>
<p id='box'>MJJ</p>
<script type="text/javascript">
// nodeObj.style
var para = document.getElementById('box');
/*
1、直接操作样式属性
console.log(para.style);
para.style.color = 'white';
para.style.backgroundColor = 'black';
para.style.width = '250px';
para.style.height = '250px';
para.style.textAlign = 'center';
para.style.lineHeight = '250px';
para.style.fontSize = '30px';
*/
// 2、通过控制属性的类名来控制样式
para.setAttribute('class', 'highLight');
</script>
</body>
</html>
6.5 DOM属性操作
elementNode.setAttribute("属性名","属性值");
elementNode.getAttribute("属性名");
elementNode.removeattribut("属性名");
6.6 class属性操作
elementNode.className
elementNode.classList.add
elementNode.classList.remove
需求:实现给这个div标签加一个样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.c1{
background-color:rebeccapurple;
}
.c2{
color: blue;
}
</style>
</head>
<body>
<div class="c1">helloooooooo</div>
<script>
var ele = document.querySelector(".c1");
ele.onclick = function (){
this.classList.add("c2");
}
</script>
</body>
</html>
7.常用事件
onload事件:
加载事件,某个标签或者某个事件加载完之后触发的事件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>窗口加载事件</title>
<script type="text/javascript">
/*
setTimeout(function(){
var oDiv = document.getElementById('box');
console.log(oDiv);
oDiv.onclick = function(){
this.innerHTML = 'alex';
}
}, 0)
*/
// 等待文档元素加载完成才会调用onload()
window.onload = function(){
var oDiv = document.getElementById('box');
console.log(oDiv);
oDiv.onclick = function(){
this.innerHTML = 'alex';
}
}
// window.onload = function(){
// console.log(11111);
// }
</script>
</head>
<body>
<div id="box">MJJ</div>
</body>
</html>
onsubmit提交事件:
submit按钮是先走我们写的onsubmit事件代码,再走它自带的submit事件。所以可以在onsubmit里写一些判断什么的。
那么如果我们要组阻止它自带的提交事件,有两种方法:
<script>
var form = document.querySelector("#i1");
var user = document.querySelector(".c1");
form.onsubmit = function (e){
if(user.value.length<5){
alert("用户名的输入长度应该大于等于5!")
// 阻止默认的提交事件
// 方式1
{#return false;#}
// 方式2 使用位置参数e,需要在function里传参
e.preventDefault()
}
}
</script>
onchange事件:
针对select标签的一个事件,动态的展示选项。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>onchange事件</title>
<style>
</style>
</head>
<body>
<select name="" id="provice">
<option value="">请选择省份</option>
<option value="hubei">湖北省</option>
<option value="shandong">山东省</option>
<option value="jiangsu">江苏省</option>
</select>
<select name="" id="city">
<option value="">请选择城市</option>
</select>
<script>
var data = {
"hubei": ["襄阳", "武汉", "荆州"],
"shandong": ["青岛", "烟台", "济南"],
"jiangsu": ["南京", "苏州", "徐州"]
};
var provice = document.querySelector("#provice");
provice.onchange = function () {
console.log(this.value);
var cities = data[this.value];
console.log(cities);
var city = document.querySelector("#city");
// 加载城市之前 清空之前的城市
{#city.options.length = 0; #}
city.options.length = 1; // 保留了请选城市的那个选项
for (var i in cities) {
console.log(cities[i]); //这里很奇怪,Java里i应该就是城市了,这里却是索引
// 创建标签
var option = document.createElement("option");
option.innerHTML = cities[i];
city.appendChild(option);// 父集添加,有几个城市创建几个option
}
}
</script>
</body>
</html>
onmouse事件:
监听鼠标的一个事件。
<script>
var ele = document.querySelector(".c1");
ele.onmouseover = function (){ // 鼠标放上去
this.style.backgroundcolor="red";
};
ele.onmouseleave = function (){ // 鼠标离开
this.style.backgroundcolor="orange";
};
</script>
onkey事件:
和键盘按键相关的事件。onkeydown 和 onkeyup什么的。
获取和失去焦点事件:
onblur和onfocus。
冒泡事件:
就是叠加的感觉,触发一个,底下那个也触发。阻止事件冒泡的是ele.stopPropagation()
浙公网安备 33010602011771号