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. 整个文档是一个文档节点
    2. 1. 每个 HTML 元素是元素节点
    3. 1. HTML 元素内的文本是文本节点
    4. 1. 每个 HTML 属性是属性节点
    5. 1. 注释是注释节点

image.png

3 获取元素

如果要操作DOM, 首先我们需要知道具体需要操作哪一个元素. 即: 获取元素

  • 获取单个元素

    1. getElementById(id的值)
  • 获取多个元素

    1. getElementByTagName(标签名)<br /> getElementByClassName(类名)
  • H5新增—推荐使用

querySelector(选择器) 第一个元素
querySelectorAll(选择器))

  1. <script>
  2. //getElementById() 方法
  3. //getElementById() 方法返回带有指定 ID 的元素:
  4. var div = document.getElementById('div01')
  5. console.log(div);//<div id="div01">中国移动</div> 其实就是将当前的标签获取到了
  6. console.log(typeof div);//object 说明在dom中,元素被封装成了对象
  7. console.dir(div) //打印的是返回的元素对象,以便更好的查看里面的属性和方法
  8. //div对象里面就有方法,就可以通过调用指定的方法去获取里面的数据
  9. console.log(div.innerHTML);
  10. </script>
  1. <script>
  2. //getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。
  3. var lis = document.getElementsByTagName('li')
  4. console.log(lis);
  5. //如果想获取单个元素
  6. console.log(lis[0]);
  7. //如果想要依次打印里面的元素,可以采用遍历的方式
  8. for(var i=0;i < lis.length ;i++){
  9. console.log(lis[i]);
  10. }
  11. </script>
  1. <script>
  2. //getElementsByClassName() 返回包含带有指定类名的所有元素的节点列表。
  3. var boxs = document.getElementsByClassName('box')
  4. console.log(boxs);
  5. //querySelector() 返回指定选择器的第一个元素 注意:里面必须要传选择器
  6. var div = document.querySelector("#nav")
  7. console.log(div);
  8. var box01 = document.querySelector(".box")
  9. console.log(box01);
  10. //querySelectorAll() 返回指定选择器的所有元素对象的集合
  11. var arr = document.querySelectorAll('.box')
  12. console.log(arr);
  13. var arr1 = document.querySelectorAll('li')
  14. console.log(arr1);
  15. </script>

4 DOM事件

1) 什么是事件驱动

我们说JavaScript采用的是事件驱动机制, 即: 触发—-响应机制

如何理解

触发一个特定的事件, 比如: 点击一个按钮. 然后会执行事件对应的函数

步骤

  1. 获取元素
  2. 注册事件(绑定事件)处理函数
  3. 触发事件, 执行函数

事件通常和js代码一起使用,可以通过事件的发生来执行一段js代码

三个要素
1,事件源 电话 电动车
2,事件 电话铃响 踹
3,事件处理程序 铃响之后班主任要做的事情 警报器响(监听器)

三个步骤
1,写一个事件源 按钮
2,写一个监听器 函数
3,绑定事件源和监听器 用一个属性绑定按钮和监听器

  1. 绑定(注册额方式)<br /> 1.传统的注册方式:利用on开头的事件 onclick,onkeyup<br /> 2.H5新增的监听注册方式: addEventListener(事件名称,匿名函数)

2) DOM操作元素

1 DOM操作元素属性

设置
元素对象.属性名 = 属性值
获取
元素对象.属性名

  1. <body>
  2. <img src="./img/off.gif" alt="">
  3. <script>
  4. //第一步:获取img元素对象
  5. var light = document.querySelector('img')
  6. //第二步:调用方法操作元素的属性
  7. light.src = "./img/on.gif" //设置src的属性的值
  8. var str = light.src //获取src的属性的值
  9. console.log(str);//http://127.0.0.1:5500/img/on.gif 图片网络上的地址
  10. </script>
  11. </body>
  1. <script>
  2. //1.获取图片对象
  3. var img = document.querySelector('img')
  4. //定义一个标记变量
  5. var flag = false //false代表灯是灭的,永远跟灯的状态保持一致
  6. //2,绑定事件
  7. img.onclick = function(){
  8. if(flag == false){
  9. img.src = './img/on.gif'
  10. flag = true //现在灯亮,那我就将flag置为true
  11. }else{
  12. img.src = './img/off.gif'
  13. flag = false //现在灯灭,那我就将flag置为false
  14. }
  15. }
  16. </script>

2 DOM操作元素标签体

设置
元素对象.innerHTML = 值
获取
元素对象.innerHTML

  1. <script>
  2. //获取div元素
  3. var div = document.querySelector("#div01")
  4. //获取标签体的内容
  5. console.log(div.innerHTML);
  6. //修改标签体的内容
  7. div.innerHTML = '下周回国贾跃亭'
  8. console.dir(div);
  9. //获取div02
  10. var div02 = document.querySelector("#div02")
  11. console.dir(div02)
  12. console.log(div02.innerHTML , div02.innerText);
  13. </script>

3 DOM操作元素CSS样式

方式一 :
设置
元素对象.style.属性名=值
获取
元素对象.style.属性名

  1. <script>
  2. //1.获取元素
  3. var div = document.querySelector('div')
  4. //2,添加事件
  5. div.onclick=function(){
  6. //修改样式(样式是在style标签里面)
  7. //div.style.width = '300px'
  8. this.style.width = '300px'//谁调用我,我代表谁,this代表div对象
  9. //console.log(this);
  10. this.style.backgroundColor='skyblue'//驼峰命名法
  11. }
  12. </script>

方式二 :
className

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <title>Document</title>
  6. <style>
  7. div{
  8. width: 100px;
  9. height: 100px;
  10. background-color: pink;
  11. }
  12. .change{
  13. width: 200px;
  14. height: 200px;
  15. background-color: skyblue;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div class="first"></div>
  21. <!-- 修改样式 -->
  22. <script>
  23. var div = document.querySelector('div')
  24. div.addEventListener('click',function(){
  25. //上面这种方式只适合改动的样式比较少的情况
  26. /* this.style.width='200px'
  27. this.style.height='200px'
  28. this.style.backgroundColor='skyblue' */
  29. //可以通过修改元素的className的值,来更改样式.适合改动样式比较多的情况
  30. this.className='change'
  31. //假如div之前就有样式,如果想保留之前的样式,可以使用 多类名选择器
  32. this.className = 'first change' //保留了之前的first样式
  33. })
  34. </script>
  35. </body>

3) 鼠标事件

事件名 触发条件
onclick 鼠标点击
onblur 失去焦点
onfocus 获得焦点
onmouseover 鼠标经过
  1. <body>
  2. <input type="text">
  3. <script>
  4. var text = document.querySelector('input')
  5. //添加获得焦点事件
  6. text.onfocus=function(){
  7. console.log('获得焦点');
  8. }
  9. //添加失去焦点事件
  10. text.onblur=function(){
  11. console.log('失去焦点');
  12. }
  13. </script>
  1. <body>
  2. <input type="text" value="婴幼儿奶粉">
  3. <script>
  4. // 需求:
  5. // 文本框获得焦点时, 文字颜色变深, 文本框的内容清空
  6. // 文本框失去焦点时, 颜色恢复, 文本框为空时, 提示内容
  7. //获取文本框
  8. var text = document.querySelector('input')
  9. //添加获得焦点事件
  10. text.onfocus=function(){
  11. //文字颜色变深
  12. text.style.color='#333'
  13. //文本框内容清空
  14. if(text.value == '婴幼儿奶粉'){
  15. text.value=''
  16. }
  17. }
  18. //添加失去焦点事件
  19. text.onblur=function(){
  20. //文字颜色变深
  21. text.style.color='#999'
  22. //文本框为空时, 提示内容
  23. if(text.value == ''){
  24. text.value='婴幼儿奶粉'
  25. }
  26. }
  27. </script>
  28. </body>

4) 键盘事件

事件名 触发条件
onkeyup 按键松开时触发
onkeydown 按键按下时触发
onkeypress 按键按下时触发, 不能识别ctrl, shift等功能键, 区分大小写
  1. <script>
  2. /*
  3. keydown 某个键盘的键被按下
  4. keyup 某个键盘的键被松开
  5. keypress 某个键盘的键被按下或按住
  6. */
  7. document.addEventListener('keydown',function(){
  8. console.log('按下按键');
  9. })
  10. document.addEventListener('keyup',function(){
  11. console.log('松开按键');
  12. })
  13. document.addEventListener('keypress',function(){
  14. console.log('不能识别功能键');//例如 按shift键,他不会被触发
  15. })
  16. </script>

5) 新增的事件注册方式

addEventListener( )

  • 在注册事件时不用加on

    示例

  1. domObj.addEventListener('click', function() {
  2. alert(22);
  3. })
  1. var div = document.querySelector('div')
  2. //h5的事件监听 第一个参数是事件名称 不要加on
  3. div.addEventListener('click',function(e){
  4. console.log('我被点了');
  5. console.log(e);
  6. console.log(e.type);//获取事件的方式
  7. })

6) 事件对象

触发一个事件的时候,就会产生事件对象,这个对象包含了所有与事件相关的信息.

  1. 本身就存在的<br /> 给函数一个参数, 在函数体里面就可以使用 例如:e<br /> 通过它可以获取事件的方式<br /> 还可以阻止标签的默认行为 (跳转,提交等)<br /> 还可以获取点击的按键<br /> 还可以阻止事件的冒泡

示例

  1. domObj.addEventListener('click', function(e) {
  2. console.dir(e)
  3. })

比较常用的属性和方法

  • e.target: 触发事件的对象
  • e.preventDafult(): 阻止默认行为
  • e.stopPropagation(): 阻止冒泡

    e.preventDafult(): 阻止默认行为

    1. <div>中国移动</div>
    2. <a href="http://wwww.baidu.com">百度</a>
    3. <script>
    4. //获取元素
    5. var div = document.querySelector('div')
    6. var a = document.querySelector('a')
    7. a.addEventListener('click',function(e){
    8. /* console.log('我被点了');
    9. console.log(e);
    10. console.log(e.type);//获取事件的方式
    11. console.log(e.preventDefault);//阻止a标签默认的跳转 */
    12. if ( e && e.preventDefault ){
    13. e.preventDefault(); //阻止默认浏览器动作(W3C)
    14. }else {
    15. window.event.returnValue = false; //IE中阻止函数器默认动作的方式
    16. }
    17. return false;
    18. })
    19. </script>

    e.stopPropagation(): 阻止冒泡

    ```javascript

son儿子
  1. <a name="Hi60S"></a>
  2. #### e.target: 触发事件的对象
  3. 通过事件对象e.target 就可以拿到具体点击了哪个元素
  4. ```javascript
  5. <body>
  6. <ul>
  7. <li>1</li>
  8. <li>2</li>
  9. <li>3</li>
  10. </ul>
  11. <script>
  12. var ul = document.querySelector('ul')
  13. ul.addEventListener('click',function(e){
  14. //console.log(this);//this这里打印是ul 因为这个事件是给ul添加的
  15. console.log(e.target);//通过事件对象e.target 就可以拿到具体点击了哪个元素
  16. })
  17. </script>

5 节点操作

1) 创建元素

createElement(‘元素名称’)

  1. <script>
  2. /* 通过js动态的在页面中添加一条水平线 */
  3. //createElement() 创建元素节点。
  4. //1.创建一个hr元素对象(默认是在内存中生成的,还需要添加到父元素上)
  5. var hr = document.createElement('hr')
  6. //2.获取父元素body对象
  7. var body = document.querySelector('body')
  8. //3,将生成的标签添加到body里面(默认是添加到最后面)
  9. body.appendChild(hr)
  10. </script>

2) 添加元素

appendChild( ) 在父级节点的子节点后面追加元素
insertBefore( ) 在父级节点的子节点前面追加元素

  1. <head>
  2. <meta charset="UTF-8" />
  3. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  4. <title>Document</title>
  5. <style>
  6. * {
  7. margin: 0;
  8. padding: 0;
  9. }
  10. body {
  11. padding: 100px;
  12. }
  13. textarea {
  14. width: 200px;
  15. height: 100px;
  16. border: 1px solid skyblue;
  17. outline: none;
  18. resize: none;
  19. }
  20. ul {
  21. margin-top: 40px;
  22. }
  23. li {
  24. width: 300px;
  25. margin: 10px 0;
  26. padding: 5px;
  27. background-color: blueviolet;
  28. color: #fff;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <textarea></textarea>
  34. <button>发布</button>
  35. <ul></ul>
  36. <script>
  37. //获取dom对象
  38. var textarea = document.querySelector('textarea')
  39. var button = document.querySelector('button')
  40. var ul = document.querySelector('ul')
  41. //给btn添加点击事件
  42. button.addEventListener('click',function(){
  43. //判断:如果文本域中没有内容,弹出提示框,并结束代码
  44. if(textarea.value == ''){
  45. alert('请输入内容')
  46. return //结束这个函数
  47. }
  48. //创建li元素
  49. var li = document.createElement('li')
  50. //将文本域中的内容赋给li元素
  51. li.innerHTML = textarea.value
  52. //将li添加到ul中
  53. //ul.appendChild(li) //在父级元素的子元素的后面追加新元素
  54. ul.insertBefore(li,ul.children[0]) //在父级元素的子元素的前面追加新元素
  55. //每次添加完之后,清空文本域中的内容
  56. textarea.value = ''
  57. })
  58. </script>
  59. </body>

3) 删除元素

removeChild( )