DOM 文档对象模型
1 DOM的概念
DOM(Document Object Model) 文档对象模型
DOM是W3C组织制定并推荐的标准, 这个标准提供了一系列操作HTML的统一API.
核心对象是 document . 每个载入浏览器的 HTML 文档都会成为 Document 对象。
HTML DOM 定义了访问和操作 HTML 文档的标准方法。
2 DOM树
DOM树 是将HTML文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面
文档: 一个HTML页面就是一个文档,DOM中使用document表示
节点: 网页中的所有内容,在DOM树中都是一个节点(标签、属性、文本、注释等)
1. 整个文档是一个文档节点1. 每个 HTML 元素是元素节点1. HTML 元素内的文本是文本节点1. 每个 HTML 属性是属性节点1. 注释是注释节点
3 获取元素
如果要操作DOM, 首先我们需要知道具体需要操作哪一个元素. 即: 获取元素
获取单个元素
getElementById(id的值)
获取多个元素
getElementByTagName(标签名)<br /> getElementByClassName(类名)
H5新增—推荐使用
querySelector(选择器) 第一个元素
querySelectorAll(选择器))
<script>//getElementById() 方法//getElementById() 方法返回带有指定 ID 的元素:var div = document.getElementById('div01')console.log(div);//<div id="div01">中国移动</div> 其实就是将当前的标签获取到了console.log(typeof div);//object 说明在dom中,元素被封装成了对象console.dir(div) //打印的是返回的元素对象,以便更好的查看里面的属性和方法//div对象里面就有方法,就可以通过调用指定的方法去获取里面的数据console.log(div.innerHTML);</script>
<script>//getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。var lis = document.getElementsByTagName('li')console.log(lis);//如果想获取单个元素console.log(lis[0]);//如果想要依次打印里面的元素,可以采用遍历的方式for(var i=0;i < lis.length ;i++){console.log(lis[i]);}</script>
<script>//getElementsByClassName() 返回包含带有指定类名的所有元素的节点列表。var boxs = document.getElementsByClassName('box')console.log(boxs);//querySelector() 返回指定选择器的第一个元素 注意:里面必须要传选择器var div = document.querySelector("#nav")console.log(div);var box01 = document.querySelector(".box")console.log(box01);//querySelectorAll() 返回指定选择器的所有元素对象的集合var arr = document.querySelectorAll('.box')console.log(arr);var arr1 = document.querySelectorAll('li')console.log(arr1);</script>
4 DOM事件
1) 什么是事件驱动
我们说JavaScript采用的是事件驱动机制, 即: 触发—-响应机制
如何理解
触发一个特定的事件, 比如: 点击一个按钮. 然后会执行事件对应的函数
步骤
- 获取元素
- 注册事件(绑定事件)处理函数
- 触发事件, 执行函数
事件通常和js代码一起使用,可以通过事件的发生来执行一段js代码
三个要素
1,事件源 电话 电动车
2,事件 电话铃响 踹
3,事件处理程序 铃响之后班主任要做的事情 警报器响(监听器)
三个步骤
1,写一个事件源 按钮
2,写一个监听器 函数
3,绑定事件源和监听器 用一个属性绑定按钮和监听器
绑定(注册额方式)<br /> 1.传统的注册方式:利用on开头的事件 onclick,onkeyup<br /> 2.H5新增的监听注册方式: addEventListener(事件名称,匿名函数)
2) DOM操作元素
1 DOM操作元素属性
设置
元素对象.属性名 = 属性值
获取
元素对象.属性名
<body><img src="./img/off.gif" alt=""><script>//第一步:获取img元素对象var light = document.querySelector('img')//第二步:调用方法操作元素的属性light.src = "./img/on.gif" //设置src的属性的值var str = light.src //获取src的属性的值console.log(str);//http://127.0.0.1:5500/img/on.gif 图片网络上的地址</script></body>
<script>//1.获取图片对象var img = document.querySelector('img')//定义一个标记变量var flag = false //false代表灯是灭的,永远跟灯的状态保持一致//2,绑定事件img.onclick = function(){if(flag == false){img.src = './img/on.gif'flag = true //现在灯亮,那我就将flag置为true}else{img.src = './img/off.gif'flag = false //现在灯灭,那我就将flag置为false}}</script>
2 DOM操作元素标签体
设置
元素对象.innerHTML = 值
获取
元素对象.innerHTML
<script>//获取div元素var div = document.querySelector("#div01")//获取标签体的内容console.log(div.innerHTML);//修改标签体的内容div.innerHTML = '下周回国贾跃亭'console.dir(div);//获取div02var div02 = document.querySelector("#div02")console.dir(div02)console.log(div02.innerHTML , div02.innerText);</script>
3 DOM操作元素CSS样式
方式一 :
设置
元素对象.style.属性名=值
获取
元素对象.style.属性名
<script>//1.获取元素var div = document.querySelector('div')//2,添加事件div.onclick=function(){//修改样式(样式是在style标签里面)//div.style.width = '300px'this.style.width = '300px'//谁调用我,我代表谁,this代表div对象//console.log(this);this.style.backgroundColor='skyblue'//驼峰命名法}</script>
方式二 :
className
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div{width: 100px;height: 100px;background-color: pink;}.change{width: 200px;height: 200px;background-color: skyblue;}</style></head><body><div class="first"></div><!-- 修改样式 --><script>var div = document.querySelector('div')div.addEventListener('click',function(){//上面这种方式只适合改动的样式比较少的情况/* this.style.width='200px'this.style.height='200px'this.style.backgroundColor='skyblue' *///可以通过修改元素的className的值,来更改样式.适合改动样式比较多的情况this.className='change'//假如div之前就有样式,如果想保留之前的样式,可以使用 多类名选择器this.className = 'first change' //保留了之前的first样式})</script></body>
3) 鼠标事件
| 事件名 | 触发条件 |
|---|---|
| onclick | 鼠标点击 |
| onblur | 失去焦点 |
| onfocus | 获得焦点 |
| onmouseover | 鼠标经过 |
<body><input type="text"><script>var text = document.querySelector('input')//添加获得焦点事件text.onfocus=function(){console.log('获得焦点');}//添加失去焦点事件text.onblur=function(){console.log('失去焦点');}</script>
<body><input type="text" value="婴幼儿奶粉"><script>// 需求:// 文本框获得焦点时, 文字颜色变深, 文本框的内容清空// 文本框失去焦点时, 颜色恢复, 文本框为空时, 提示内容//获取文本框var text = document.querySelector('input')//添加获得焦点事件text.onfocus=function(){//文字颜色变深text.style.color='#333'//文本框内容清空if(text.value == '婴幼儿奶粉'){text.value=''}}//添加失去焦点事件text.onblur=function(){//文字颜色变深text.style.color='#999'//文本框为空时, 提示内容if(text.value == ''){text.value='婴幼儿奶粉'}}</script></body>
4) 键盘事件
| 事件名 | 触发条件 |
|---|---|
| onkeyup | 按键松开时触发 |
| onkeydown | 按键按下时触发 |
| onkeypress | 按键按下时触发, 不能识别ctrl, shift等功能键, 区分大小写 |
<script>/*keydown 某个键盘的键被按下keyup 某个键盘的键被松开keypress 某个键盘的键被按下或按住*/document.addEventListener('keydown',function(){console.log('按下按键');})document.addEventListener('keyup',function(){console.log('松开按键');})document.addEventListener('keypress',function(){console.log('不能识别功能键');//例如 按shift键,他不会被触发})</script>
5) 新增的事件注册方式
addEventListener( )
- 在注册事件时不用加on
示例
domObj.addEventListener('click', function() {alert(22);})
var div = document.querySelector('div')//h5的事件监听 第一个参数是事件名称 不要加ondiv.addEventListener('click',function(e){console.log('我被点了');console.log(e);console.log(e.type);//获取事件的方式})
6) 事件对象
触发一个事件的时候,就会产生事件对象,这个对象包含了所有与事件相关的信息.
本身就存在的<br /> 给函数一个参数, 在函数体里面就可以使用 例如:e<br /> 通过它可以获取事件的方式<br /> 还可以阻止标签的默认行为 (跳转,提交等)<br /> 还可以获取点击的按键<br /> 还可以阻止事件的冒泡
示例
domObj.addEventListener('click', function(e) {console.dir(e)})
比较常用的属性和方法
- e.target: 触发事件的对象
- e.preventDafult(): 阻止默认行为
-
e.preventDafult(): 阻止默认行为
<div>中国移动</div><a href="http://wwww.baidu.com">百度</a><script>//获取元素var div = document.querySelector('div')var a = document.querySelector('a')a.addEventListener('click',function(e){/* console.log('我被点了');console.log(e);console.log(e.type);//获取事件的方式console.log(e.preventDefault);//阻止a标签默认的跳转 */if ( e && e.preventDefault ){e.preventDefault(); //阻止默认浏览器动作(W3C)}else {window.event.returnValue = false; //IE中阻止函数器默认动作的方式}return false;})</script>
e.stopPropagation(): 阻止冒泡
```javascript
<a name="Hi60S"></a>#### e.target: 触发事件的对象通过事件对象e.target 就可以拿到具体点击了哪个元素```javascript<body><ul><li>1</li><li>2</li><li>3</li></ul><script>var ul = document.querySelector('ul')ul.addEventListener('click',function(e){//console.log(this);//this这里打印是ul 因为这个事件是给ul添加的console.log(e.target);//通过事件对象e.target 就可以拿到具体点击了哪个元素})</script>
5 节点操作
1) 创建元素
createElement(‘元素名称’)
<script>/* 通过js动态的在页面中添加一条水平线 *///createElement() 创建元素节点。//1.创建一个hr元素对象(默认是在内存中生成的,还需要添加到父元素上)var hr = document.createElement('hr')//2.获取父元素body对象var body = document.querySelector('body')//3,将生成的标签添加到body里面(默认是添加到最后面)body.appendChild(hr)</script>
2) 添加元素
appendChild( ) 在父级节点的子节点后面追加元素
insertBefore( ) 在父级节点的子节点前面追加元素
<head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>* {margin: 0;padding: 0;}body {padding: 100px;}textarea {width: 200px;height: 100px;border: 1px solid skyblue;outline: none;resize: none;}ul {margin-top: 40px;}li {width: 300px;margin: 10px 0;padding: 5px;background-color: blueviolet;color: #fff;}</style></head><body><textarea></textarea><button>发布</button><ul></ul><script>//获取dom对象var textarea = document.querySelector('textarea')var button = document.querySelector('button')var ul = document.querySelector('ul')//给btn添加点击事件button.addEventListener('click',function(){//判断:如果文本域中没有内容,弹出提示框,并结束代码if(textarea.value == ''){alert('请输入内容')return //结束这个函数}//创建li元素var li = document.createElement('li')//将文本域中的内容赋给li元素li.innerHTML = textarea.value//将li添加到ul中//ul.appendChild(li) //在父级元素的子元素的后面追加新元素ul.insertBefore(li,ul.children[0]) //在父级元素的子元素的前面追加新元素//每次添加完之后,清空文本域中的内容textarea.value = ''})</script></body>
3) 删除元素
removeChild( )
