JavaScript进阶班之DOM技术总结

目录总览

1、DOM简介

1.1、什么是DOM

文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口,W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式。

DOM 把以上内容都看做是对象

2、获取元素

2.1、如何获取页面元素

DOM在我们实际开发中主要用来操作元素。

我们如何来获取页面中的元素呢?

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

2.2、根据ID获取

使用 getElementByld() 方法可以获取带ID的元素对象

doucument.getElementByld('id名')

使用 console.dir() 可以打印我们获取的元素对象,更好的查看对象里面的属性和方法。

示例

2019-9-9

2.3、根据标签名获取

根据标签名获取,使用 getElementByTagName() 方法可以返回带有指定标签名的对象的集合

doucument.getElementsByTagName('标签名');
  • 知否知否,应是等你好久
  • 知否知否,应是等你好久
  • 知否知否,应是等你好久
  • 知否知否,应是等你好久
  • 知否知否,应是等你好久

2.4、根据标签名获取

还可以根据标签名获取某个元素(父元素)内部所有指定标签名的子元素,获取的时候不包括父元素自己

element.getElementsByTagName('标签名')ol.getElementsByTagName('li');

注意:父元素必须是单个对象(必须指明是哪一个元素对象),获取的时候不包括父元素自己

2.5、通过H5新增方法获取

①getElementsByClassName

根据类名返回元素对象合集

document.getElementsByClassName('类名'); 

②document.querySelector

根据指定选择器返回第一个元素对象

document.querySelector('选择器');// 切记里面的选择器需要加符号 // 类选择器.box // id选择器 #navvar firstBox = document.querySelector('.box');

③document.querySelectorAll

根据指定选择器返回所有元素对象

document.querySelectorAll('选择器');

注意:

querySelectorquerySelectorAll 里面的选择器需要加符号,比如: document.querySelector('#nav');

④例子

2.6、获取特殊元素

①获取body元素

返回body元素对象

document.body;

②获取html元素

返回html元素对象

document.documentElement;

3、事件基础

3.1、事件概述

JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。

简单理解: 触发— 响应机制。

网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。

3.2、事件三要素

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

3.3、执行事件的步骤

  1. 获取事件源
  2. 注册事件(绑定事件)
  3. 添加事件处理程序(采取函数赋值形式)

3.4、鼠标事件

鼠标事件

触发条件

onclick

鼠标点击左键触发

onmouseover

鼠标经过触发

onmouseout

鼠标离开触发

onfocus

获得鼠标焦点触发

onblur

失去鼠标焦点触发

onmousemove

鼠标移动触发

onmouseup

鼠标弹起触发

onmousedown

鼠标按下触发

4、操作元素

JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容 、属性等。注意以下都是属性

4.1、改变元素内容

从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉。

element.innerText

起始位置到终止位置的全部内容,包括HTML标签,同时保留空格和换行

element.innerHTML
        

我是文字 123

4.2、改变元素属性

// img.属性img.src = "xxx";input.value = "xxx";input.type = "xxx";input.checked = "xxx";input.selected = true / false;input.disabled = true / false;

4.3、改变样式属性

我们可以通过 JS 修改元素的大小、颜色、位置等样式。

// element.stylep.style.backgroundColor = 'pink';p.style.width = '250px';
// element.className

注意:

  1. JS里面的样式采取驼峰命名法,比如 fontSize ,backgroundColor
  2. JS 修改 style 样式操作 ,产生的是行内样式,CSS权重比较高
  3. 如果样式修改较多,可以采取操作类名方式更改元素样式
  4. class 因为是个保留字,因此使用className来操作元素类名属性
  5. className 会直接更改元素的类名,会覆盖原先的类名
    文本

4.4、总结

4.5、排他思想

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

  1. 所有元素全部清除样式(干掉其他人)
  2. 给当前元素设置样式 (留下我自己)
  3. 注意顺序不能颠倒,首先干掉其他人,再设置自己
                      

4.6、自定义属性

4.6.1、获取属性值

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

4.6.2、设置属性值

element.属性 = '值';
element.setAttribute('属性','值');

4.6.3、移除属性

element.removeAttribute('属性');
        

4.7、H5自定义属性

自定义属性目的:

4.7.1 设置H5自定义属性

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

// 或者使用JavaScript设置p.setAttribute('data-index',1);

4.7.2 获取H5自定义属性

      

5、节点操作

获取元素通常使用两种方式:

1.利用DOM提供的方法获取元素

2.利用节点层级关系获取元素

document.getElementById()

利用父子兄节点关系获取元素

document.getElementsByTagName()

逻辑性强,但是兼容性较差

document.querySelector 等


逻辑性不强,繁琐


这两种方式都可以获取元素节点,我们后面都会使用,但是节点操作更简单

一般的,节点至少拥有三个基本属性

5.1、节点概述

网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。

HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。

一般的,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

我们在实际开发中,节点操作主要操作的是元素节点

利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系

5.2、父级节点

node.parentNode
      我是p    我是span    
  • 我是li
  • 我是li
  • 我是li
  • 我是li

5.3、子结点

parentNode.childNodes(标准)
parentNode.children(非标准)
  
  • 我是li
  • 我是li
  • 我是li
  • 我是li
  1. 我是li
  2. 我是li
  3. 我是li
  4. 我是li

5.3.1、第一个子结点

parentNode.firstChild

5.3.2、最后一个子结点

parentNode.lastChild
  
  1. 我是li1
  2. 我是li2
  3. 我是li3
  4. 我是li4
  5. 我是li5

5.3.3、第一个子结点(兼容性)

parentNode.firstElementChild

5.3.4、最后一个子结点(兼容性)

parentNode.lastElementChild

5.3.5、解决方案

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

解决方案

// 数组元素个数减1 就是最后一个元素的索引号parentNode.chilren[parentNode.chilren.length - 1]
    
  1. 我是li1
  2. 我是li2
  3. 我是li3
  4. 我是li4

5.4、兄弟节点

5.4.1、下一个兄弟节点

node.nextSibling

5.4.2、上一个兄弟节点

node.previousSibling

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

node.nextElementSibling

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

node.previousElementSibling

示例

    我是p    我是span

如何解决兼容性问题 ?

答:自己封装一个兼容性的函数

function getNextElementSibling(element) {  var el = element;    while(el = el.nextSibling) {        if(el.nodeType === 1){            return el;        }    }    return null;}

5.5、创建节点

document.createElement('tagName');

5.5.1、添加节点

node.appendChild(child)
node.insertBefore(child,指定元素)

示例

    
  • 123

5.5.2、删除节点

node.removeChild(child)

5.5.3、复制节点(克隆节点)

node.cloneNode()

示例

    
  • 1111
  • 2
  • 3

5.5.4、面试题

三种动态创建元素的区别

区别

        

总结:不同浏览器下, innerHTML 效率要比 createElement 高

6、DOM核心

对于DOM操作,我们主要针对子元素的操作,主要有

6.1、创建

  1. document.write
  2. innerHTML
  3. createElement

6.2、增

  1. appendChild
  2. insertBefore

6.3、删

  1. removeChild

6.4、改

  1. 修改元素属性:src、href、title 等
  2. 修改普通元素内容:innerHTML、innerText
  3. 修改表单元素:value、type、disabled
  4. 修改元素样式:style、className

6.5、查

  1. DOM提供的API方法:getElementById、getElementsByTagName (古老用法,不推荐)
  2. H5提供的新方法:querySelector、querySelectorAll (提倡)
  3. 利用节点操作获取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling) 提倡

6.6、属性操作

  1. setAttribute:设置dom的属性值
  2. getAttribute:得到dom的属性值
  3. removeAttribute:移除属性

7、事件高级

7.1、注册事件(绑定事件)

给元素添加事件,称为注册事件或者绑定事件

注册事件有两种方式:传统方式和方法监听注册方式

传统注册方式

方法监听注册方式

利用 on 开头的事件 onclick

w3c 标准推荐方式

addEventListener() 它是一个方法

btn.onclick = function() {}

IE9 之前的 IE 不支持此方法,可使用 attachEvent() 代替

特点:注册事件的唯一性

特点:同一个元素同一个事件可以注册多个监听器

同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数

按注册顺序依次执行

①addEventListener事件监听方式

eventTarget.addEventListener(type,listener[,useCapture])

该方法接收三个参数:

            

②attachEvent事件监听方式(兼容)

eventTarget.attachEvent(eventNameWithOn,callback)

该方法接收两个参数:

③注册事件兼容性解决方案

兼容性处理的原则:首先照顾大多数浏览器,再处理特殊浏览器

 function addEventListener(element, eventName, fn) {   // 判断当前浏览器是否支持 addEventListener 方法      if (element.addEventListener) {        element.addEventListener(eventName, fn);  // 第三个参数 默认是false      } else if (element.attachEvent) {        element.attachEvent('on' + eventName, fn);      } else {        // 相当于 element.onclick = fn;        element['on' + eventName] = fn; } 

7.2、删除事件(解绑事件)

7.2.1、removeEventListener删除事件方式

eventTarget.removeEventListener(type,listener[,useCapture]);

该方法接收三个参数:

7.2.2、detachEvent删除事件方式(兼容)

eventTarget.detachEvent(eventNameWithOn,callback);

该方法接收两个参数:

7.2.3、传统事件删除方式

eventTarget.onclick = null;

事件删除示例:

    1    2    3

7.2.4、删除事件兼容性解决方案

 function removeEventListener(element, eventName, fn) {   // 判断当前浏览器是否支持 removeEventListener 方法      if (element.removeEventListener) {        element.removeEventListener(eventName, fn);  // 第三个参数 默认是false      } else if (element.detachEvent) {        element.detachEvent('on' + eventName, fn);      } else {        element['on' + eventName] = null; } 

7.3、DOM事件流

加深理解

我们向水里面扔一块石头,首先它会有一个下降的过程,这个过程就可以理解为从最顶层向事件发生的最具体元素(目标点)的捕获过程;之后会产生泡泡,会在最低点( 最具体元素)之后漂浮到水面上,这个过程相当于事件冒泡。

7.3.1、捕获阶段

两个盒子嵌套,一个父盒子一个子盒子,我们的需求是当点击父盒子时弹出 father ,当点击子盒子时弹出 son

          son盒子        

但是因为DOM流的影响,我们点击子盒子,会先弹出 father,之后再弹出 son

这是因为捕获阶段由 DOM 最顶层节点开始,然后逐级向下传播到到最具体的元素接收

7.3.2、冒泡阶段

          son盒子        

我们点击子盒子,会弹出 son、father、document

这是因为冒泡阶段开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点

7.3.3、小结

7.4、事件对象

eventTarget.onclick = function(event) {   // 这个 event 就是事件对象,我们还喜欢的写成 e 或者 evt } eventTarget.addEventListener('click', function(event) {   // 这个 event 就是事件对象,我们还喜欢的写成 e 或者 evt  })

简单理解:

事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面

这个对象就是事件对象 event,它有很多属性和方法,比如“

谁绑定了这个事件

鼠标触发事件的话,会得到鼠标的相关信息,如鼠标位置

键盘触发事件的话,会得到键盘的相关信息,如按了哪个键

    123

7.4.1、事件对象的兼容性方案

事件对象本身的获取存在兼容问题:

  1. 标准浏览器中是浏览器给方法传递的参数,只需要定义形参 e 就可以获取到。
  2. 在 IE6~8 中,浏览器不会给方法传递参数,如果需要的话,需要到 window.event 中获取查找

解决:

e = e || window.event;

7.4.2、事件对象的常见属性和方法

事件对象属性方法

说明

e.target

返回触发事件的对象 标准

e.srcElement

返回触发事件的对象 非标准 ie6-8使用

e.type

返回事件的类型 比如click mouseover 不带on

e.cancelBubble

该属性阻止冒泡,非标准,ie6-8使用

e.returnValue

该属性阻止默认行为 非标准,ie6-8使用

e.preventDefault()

该方法阻止默认行为 标准 比如不让链接跳转

e.stopPropagation()

阻止冒泡 标准

e.targetthis 的区别:

7.5、事件对象阻止默认行为

    123百度        

7.6、阻止事件冒泡

事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点

事件冒泡本身的特性,会带来的坏处,也会带来的好处,需要我们灵活掌握。

e.stopPropagation();
e.cancelBubble = true;
            son儿子        

7.6.1、阻止事件冒泡的兼容性解决方案

if(e && e.stopPropagation){  e.stopPropagation();  }else{      window.event.cancelBubble = true;  }

4.4.4 e.target 与 this

e.target 与 this 的区别

    123
  • abc
  • abc
  • abc

4.4.5 事件对象的兼容性

事件对象本身的获取存在兼容问题:

解决方案

    123

以上案例:给 ul 注册点击事件,然后利用事件对象的 target 来找到当前点击的 li,因为点击 li,事件会冒泡到 ul 上, ul 有注册事件,就会触发事件监听器。

7.8、常见的鼠标事件

鼠标事件

触发条件

onclick

鼠标点击左键触发

onmouseover

鼠标经过触发

onmouseout

鼠标离开触发

onfocus

获得鼠标焦点触发

onblur

失去鼠标焦点触发

onmousemove

鼠标移动触发

onmouseup

鼠标弹起触发

onmousedown

鼠标按下触发

7.8.1、禁止鼠标右键与鼠标选中

    

我是一段不愿意分享的文字

7.8.2、鼠标事件对象

鼠标事件对象

说明

e.clientX

返回鼠标相对于浏览器窗口可视区的X坐标

e.clientY

返回鼠标相对于浏览器窗口可视区的Y坐标

e.pageX(重点)

返回鼠标相对于文档页面的X坐标 IE9+ 支持

e.pageY(重点)

返回鼠标相对于文档页面的Y坐标 IE9+ 支持

e.screenX

返回鼠标相对于电脑屏幕的X坐标

e.screenY

返回鼠标相对于电脑屏幕的Y坐标

示例:

    

7.9、常用的键盘事件

键盘事件

触发条件

onkeyup

某个键盘按键被松开时触发

onkeydown

某个键盘按键被按下时触发

onkeypress

某个键盘按键被按下时触发,但是它不识别功能键,比如 ctrl shift 箭头等

    

7.9.1、键盘对象属性

键盘事件对象 属性

说明

keyCode

返回该值的ASCII值

  
展开阅读全文

页面更新:2024-05-14

标签:进阶   兼容性   节点   样式   函数   属性   元素   对象   事件   操作   方法   技术

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top