1.DOM简介

文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。

  • 文档:一个页面就是一个文档,DOM中使用doucument来表示
  • 元素:页面中的所有标签都是元素,DOM中使用 element 表示
  • 节点:网页中的所有内容都是节点(标签,属性,文本,注释等),DOM中使用node表示

2.获取元素

获取页面中的元素可以使用以下几种方式:

  • 根据 ID 获取
  • 根据标签名获取
  • 通过 HTML5 新增的方法获取
  • 特殊元素获取

    2.2根据ID获取

    使用 getElementByld() 方法可以获取带ID的元素对象
    1. doucument.getElementByld('id名')
    1. <div id="time">2019-9-9</div>
    2. <script>
    3. //使用 getElementByld() 方法可以获取带ID的元素对象
    4. var time = document.getElementById('time');
    5. console.log(time);
    6. // console.dir 打印我们的元素对象
    7. // 更好的查看里面的属性和方法
    8. console.dir(time);
    9. </script>

    2.3根据标签名获取

    根据标签名获取,使用 getElementByTagName() 方法可以返回带有指定标签名的对象的集合
    1. doucument.getElementsByTagName('标签名');
    2. document.getElementsByTagName('li');
    1. <ul>
    2. <li>知否知否,应是等你好久</li>
    3. <li>知否知否,应是等你好久</li>
    4. <li>知否知否,应是等你好久</li>
    5. <li>知否知否,应是等你好久</li>
    6. <li>知否知否,应是等你好久</li>
    7. </ul>
    8. <script>
    9. var lis = document.getElementsByTagName('li');
    10. console.log(lis);
    11. console.log(lis[0]);
    12. </script>

    2.4根据标签名(父元素)获取

    还可以根据标签名获取某个元素(父元素)内部所有指定标签名的子元素,获取的时候不包括父元素自己
    1. element.getElementsByTagName('标签名')
    2. ol.getElementsByTagName('li');

2.5通过H5新增方法获取

2.5.1getElementsByClassName

  1. document.getElementsByClassName('类名');

2.5.2document.querySelector

querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素

  1. document.querySelector('选择器');
  2. //
  3. // 切记里面的选择器需要加符号
  4. // 类选择器.box
  5. // id选择器 #nav
  6. var firstBox = document.querySelector('.box');

2.5.3document.querySelectorAll

querySelectorAll() 方法返回文档中匹配指定 CSS 选择器的所有元素

  1. document.querySelectorAll('选择器');

querySelector 和 querySelectorAll 里面的选择器需要加符号,比如: document.querySelector(‘#nav’);

  1. // 1. getElementsByClassName 根据类名获得某些元素集合
  2. var boxs = document.getElementsByClassName('box');
  3. console.log(boxs);
  4. // 2. querySelector返回指定选择器的第一个元素对象,切记里面的选择器需要加符号.box #nav
  5. var firstBox = document.querySelector('.box');
  6. console.log(firstBox);
  7. var nav = document.querySelector('#nav');
  8. console.log(nav);
  9. var li = document.querySelector('li');
  10. console.log(li);
  11. // 3. querySelectorAll()返回指定选择器的所有元素对象集合
  12. var allBox = document.querySelectorAll('.box');
  13. console.log(allBox);
  14. var lis = document.querySelectorAll('li');
  15. console.log(lis);

2.6获取特殊元素

2.6.1获取body元素

  1. document.body

2.6.2获取html元素

  1. document.documentElement

3.事件基础

JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。
网页中的每个元素都可以产生某些可以触发 JavaScript 的事件

3.1事件三要素

  1. 事件源(谁)
  2. 事件类型(什么事件)
  3. 事件处理程序(做啥)

    1. <button id='btn'>唐伯虎</button>
    2. <script>
    3. var btn = document.getElementById('btn');
    4. btn.onclick = function() {
    5. alert('点秋香');
    6. }
    7. </script>

    3.2执行事件的步骤

  4. 获取事件源

  5. 注册事件(绑定事件)
  6. 添加事件处理程序(采取函数赋值形式)
    1. var div = document.querySelector('div');
    2. div.onclick = function() {
    3. console.log('我被选中了');
    4. }

    3.3鼠标事件

    | 鼠标事件 | 触发条件 | | —- | —- | | onclick | 鼠标点击左键触发 | | onmouseover | 鼠标经过触发 | | onmouseout | 鼠标离开触发 | | onfocus | 获得鼠标焦点触发 | | onblur | 失去鼠标焦点触发 | | onmousemove | 鼠标移动触发 | | onmouseup | 鼠标弹起触发 | | onmousedown | 鼠标按下触发 |

4.操作元素

JavaScript 的 DOM 操作可以改变网页内容、结构和样式。

4.1改变元素内容

  1. //innerText 不识别html标签 去除空格和换行
  2. element.innerText
  1. //innerHTML 识别html标签 保留空格和换行的
  2. element.innerHTML
  1. <div></div>
  2. <script>
  3. var div = document.querySelector('div');
  4. div.innerText = '<strong>今天是:</strong> 2020';
  5. </script>
  1. <div></div>
  2. <script>
  3. var div = document.querySelector('div');
  4. div.innerHTML = '<strong>今天是:</strong> 2020';
  5. </script>
  1. var p = document.querySelector('p');
  2. console.log(p.innerText);
  3. console.log(p.innerHTML);

4.2改变元素属性

  1. <button id='hg'>胡歌</button>
  2. <button id='xs'>许嵩</button>
  3. <img src="images/hg.jpeg" >
  4. <script>
  5. var hg = document.getElementById('hg')
  6. var xs = document.getElementById('xs')
  7. var img=document.querySelector('img')
  8. hg.onclick=function(){
  9. img.src='images/hg.jpeg'
  10. }
  11. xs.onclick=function(){
  12. img.src='images/xs.jpg'
  13. }
  14. </script>

4.3改变表单属性

  1. <button>按钮</button>
  2. <input type="text" value="输入内容">
  3. <script>
  4. var btn = document.querySelector('button')
  5. var input = document.querySelector('input')
  6. btn.onclick=function(){
  7. input.value='我输入内容了'
  8. // btn.disabled=true
  9. this.disabled=true
  10. }
  11. </script>

4.4排他思想

如果有同一组元素,我们相要某一个元素实现某种样式,需要用到循环的排他思想算法:

  1. 所有元素全部清除样式(干掉其他人)
  2. 给当前元素设置样式 (留下我自己)
  3. 注意顺序不能颠倒,首先干掉其他人,再设置自己
    1. <button>按钮1</button>
    2. <button>按钮2</button>
    3. <button>按钮3</button>
    4. <button>按钮4</button>
    5. <button>按钮5</button>
    6. <script>
    7. // 1. 获取所有按钮元素
    8. var btns=document.getElementsByTagName('button')
    9. // 2.btns得到的是伪数组 里面的每一个元素 btns[i]
    10. for(var i=0;i<btns.length;i++){
    11. btns[i].onclick=function(){
    12. for(var i = 0;i<btns.length;i++){
    13. //先把所有的按钮背景颜色去掉
    14. btns[i].style.background=''
    15. }
    16. //然后才让当前的元素背景颜色为pink
    17. this.style.background='pink'
    18. }
    19. }
    20. </script>

    4.5.自定义属性

4.5.1获取属性值

获取内置属性值(元素本身自带的属性)

  1. element.属性;

获取自定义的属性

  1. element.getAttribute('属性');

4.5.2设置属性值

设置内置属性值

  1. element.属性 = '值';

主要设置自定义的属性

  1. element.setAttribute('属性');

4.5.2移除属性

  1. element.removeAttribute('属性');
  1. <body>
  2. <div id="demo" index="1" class="nav"></div>
  3. <script>
  4. var div = document.querySelector('div');
  5. // 1. 获取元素的属性值
  6. // (1) element.属性
  7. console.log(div.id);
  8. //(2) element.getAttribute('属性')
  9. //get得到获取 attribute 属性的意思 添加的属性我们称为自定义属性
  10. console.log(div.getAttribute('id'));
  11. console.log(div.getAttribute('index'));
  12. // 2. 设置元素属性值
  13. // (1) element.属性= '值'
  14. div.id = 'test';
  15. div.className = 'navs';
  16. // (2) element.setAttribute('属性', '值'); 主要针对于自定义属性
  17. div.setAttribute('index', 2);
  18. div.setAttribute('class', 'footer'); // class 特殊
  19. // 3.移除属性 removeAttribute(属性)
  20. div.removeAttribute('index');
  21. </script>
  22. </body>

4.6.H5自定义属性

自定义属性目的:

  • 保存并保存数据,有些数据可以保存到页面中而不用保存到数据库中
  • 有些自定义属性很容易引起歧义,不容易判断到底是内置属性还是自定义的,所以H5有了规定

    4.6.1 设置H5自定义属性

    H5规定自定义属性 data-开头作为属性名并赋值

    1. <div data-index="1"></div>
    2. <script>
    3. var div = document.querySelector('div')
    4. div.setAttribute('data-index',1)
    5. </script>

    4.6.2 获取H5自定义属性

  • 兼容性获取 element.getAttribute(‘data-index’)

  • H5新增的:element.dataset.index 或element.dataset[‘index’]

    1. <div data-index="1"></div>
    2. <script>
    3. var div = document.querySelector('div')
    4. div.setAttribute('data-index',1)
    5. console.log(div.getAttribute('data-index'))
    6. //h5新增的获取自定义属性的方法 它只能获取data-开头的
    7. //dataset 是一个集合里面存放了所有以data开头的自定义属性
    8. console.log(div.dataset.index)
    9. console.log(div.dataset['index'])
    10. </script>

    5.节点操作

    网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
    HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。
    我们在实际开发中,节点操作主要操作的是元素节点
    利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系

    5.1父节点

    1. node.parentNode
    1. <div class="demo">
    2. <div class="box">
    3. <span class="box1"></span>
    4. </div>
    5. </div>
    6. <script>
    7. var box1=document.querySelector('.box1')
    8. //父节点 parentNode
    9. //到的是离元素最近的父级节点
    10. console.log(box1.parentNode)
    11. var box=document.querySelector('.box')
    12. console.log(box)
    13. </script>

    5.2子结点

    1. arentNode.childNodes(标准)
    2. parentNode.children(非标准)
  • parentNode.childNodes 返回包含指定节点的子节点的集合,该集合为即时更新的集合

  • 返回值包含了所有的子结点,包括元素节点,文本节点等
  • 如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes
  • parentNode.children 是一个只读属性,返回所有的子元素节点
  • 它只返回子元素节点,其余节点不返回 (这个是我们重点掌握的
  • 虽然 children 是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用

    1. <ul>
    2. <li>我是li</li>
    3. <li>我是li</li>
    4. <li>我是li</li>
    5. <li>我是li</li>
    6. </ul>
    7. <script>
    8. // DOM 提供的方法(API)获取
    9. var ul = document.querySelector('ul')
    10. var lis = document.querySelectorAll('li')
    11. //子节点childNodes 所有的子节点 包含 元素节点 文本节点等等
    12. console.log(ul.childNodes)
    13. //children 获取所有的子元素节点 也是我们实际开发常用的
    14. console.log(ul.children)
    15. </script>

    5.3.1第一个子结点

    1. parentNode.firstChild
  • firstChild 返回第一个子节点,找不到则返回null

  • 同样,也是包含所有的节点

    5.3.2最后一个子结点

    1. parentNode.lastChild
    1. <ul>
    2. <li>我是li</li>
    3. <li>我是li</li>
    4. <li>我是li</li>
    5. <li>我是li</li>
    6. </ul>
    7. <script>
    8. // DOM 提供的方法(API)获取
    9. var ul = document.querySelector('ul')
    10. //firstChild 第一个子节点 不管是文本节点还是元素节点
    11. console.log(ul.firstChild)
    12. console.log(ul.lastChild)
    13. console.log(ul.firstElementChild)
    14. console.log(ul.lastElementChild)
    15. </script>

    实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢?

    1. var ul = document.querySelector('ul')
    2. //firstChild 第一个子节点 不管是文本节点还是元素节点
    3. // console.log(ul.firstChild)
    4. console.log(ul.children[0])
    5. // console.log(ul.lastChild)
    6. console.log(ul.children[ul.children.length - 1])
    7. // console.log(ul.firstElementChild)
    8. // console.log(ul.lastElementChild)

    5.3兄弟节点

    5.3.1下一个兄弟节点

    1. node.nextSibling
  • nextSibling 返回当前元素的下一个兄弟元素节点,找不到则返回null

  • 同样,也是包含所有的节点

    5.3.2上一个兄弟节点

    1. node.previousSibling
  • previousSibling 返回当前元素上一个兄弟元素节点,找不到则返回null

  • 同样,也是包含所有的节点

    5.3.3下一个兄弟节点(兼容性)

    1. node.nextElementSibling
  • nextElementSibling 返回当前元素下一个兄弟元素节点,找不到则返回null

  • 有兼容性问题,IE9才支持

    5.4.4、上一个兄弟节点(兼容性)

    1. node.previousElementSibling
  • previousElementSibling 返回当前元素上一个兄弟元素节点,找不到则返回null

  • 有兼容性问题,IE9才支持
  1. <div>我是div</div>
  2. <span>我是span</span>
  3. <script>
  4. var div = document.querySelector('div')
  5. //1.nextSibling 下一个兄弟节点 包含元素节点或者 文本节点等等
  6. console.log(div.nextSibling) //#text
  7. console.log(div.previousSibling) //#text
  8. //2. nextElementSibling 得到下一个兄弟元素节点
  9. console.log(div.nextElementSibling) //<span>我是span</span>
  10. console.log(div.previousElementSibling) //null
  11. </script>

5.4创建节点

  1. document.createElement('tagName');
  • document.createElement() 方法创建由 tagName 指定的HTML 元素
  • 因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点

    5.4.1添加节点

    1. node.appendChild(child)
    node.appendChild() 方法将一个节点添加到指定父节点的子节点列表末尾。类似于 CSS 里面的 after 伪元素
    1. node.insertBefore(child,指定元素)
    node.insertBefore() 方法将一个节点添加到父节点的指定子节点前面。类似于 CSS 里面的 before 伪元素