一.DOM简介
1.1什么是DOM
- 文档对象模型(Document Object Model,简称DOM),是3C组织推荐的处理可扩展标记语言(html或者xml)的标准编程接口
- W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容,结构和样式
1.2DOM树
- 文档:一个页面就是一个文档。DOM中使用document表示
- 元素:页面中的所有标签都是元素,DOM中使用element表示
- 节点:网页中的所有内容都是节点(标签,属性,文本,注释等),DOM中使用node表示
- DOM把以上内容都看做是对象
二.获取元素
2.1如何获取页面元素
获取页面中的元素可以使用以下几种方式:
- 根据ID获取
- 根据标签名获取
- 通过HTML5新增的方法获取
- 特殊元素获取
2.2根据ID获取
使用getElementByld()方法可以获取带有ID的元素对象
2.3获取标签名获取
使用getElementsByTagName()方法可以返回带有指定标签名的对象的集合
2.4通过HTML5新增的方法获取
2.5获取特殊元素(body,html)
- 获取body元素
- 获取html元素
三.事件基础
3.1事件概述
- JS使我们有能力创建动态页面,而事件可以被JS侦测到的行为
- 简单理解:触发--响应机制
- 网页中的每个元素都可以产生某些可以触发JS的事件,例如,我们可以在用户点击某按钮使产生一个事件,然后去执行某些操作
3.2执行事件的步骤
- 获取事件源
- 注册事件(绑定事件)
- 添加事件处理程序(采取函数赋值形式)
3.3常见的鼠标事件
3.4分析事件三要素
- 下拉菜单三要素
- 关闭广告三要素
四.操作元素
JS的DOM操作可以改变网页内容,结构和样式,我们可以利用DOM操作元素来改变元素里面的内容,属性等。注意以下都是属性
4.1改变元素内容
从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉
- 第一种
- 第二种
起始位置到终止位置的全部内容,包括html标签(用的比较多),同时保留空格和换行
- 区别
4.2常用元素的属性操作
4.3表单元素的属性操作
利用DOM可以操作如下表单元素的属性:
4.4样式属性操作
我们可以通过JS修改元素的大小,颜色,位置等样式
- 注意:
- JS里面的样式采取驼峰命名法,比如fontSize。。。
- JS修改style样式操作,产生的是行内样式,css权重比较高
总结
4.5排他思想
如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式(留下自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
4.6自定义属性的操作
- 获取属性值
- elemebt.属性 -- 获取属性值
- element.getAttribute('属性')
- 区别
- element.属性----获取内置属性值(元素本身自带的属性)
- element.getAttribute('属性');主要获得自定义的属性(标准)我们程序员自定义的属性
- 设置属性值
- element.属性='值'---设置内置属性值
- element.setAttribute('属性','值')
- 移除属性
- elemen.removeAttribute('属性')
4.7H5自定义属性
自定义属性的目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中
- 设置H5自定义属性 H5规定自定义属性data开头做为属性名并且赋值 比如:
2. 获取H5自定义属性
五.节点操作
5.1为什么学节点操作
- 获取元素通常使用两种方式:
- 这两种方式都可以获取元素节点,后面都会使用,但是节点操作更简单
5.2节点概述
一般地,节点至少拥有node Type(节点类型),nodeName(节点名称)和nodeValue(节点值)这三个基本属性
- 元素节点 nodeType 为1
- 属性节点 nodeType 为2
- 文本节点 nodeType为3(文本节点包含文字,空格,换行等)
- 我们在实际开发中,节点操作主要操作的是元素节点
5.3节点层级
利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系
- 父级节点
- parentNode属性可返回某节点的父节点,注意是最近的一个父节点
- 如果指定的节点没有父节点则返回null
- 子节点
方法一
方法二
3. 兄弟节点
5.4创建节点
- document.createElement('tagName')方法创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点
5.5添加节点
node.appendChild()方法将一个节点添加到指定父节点的子节点列表末尾。类似于css里面的after伪元素
node.insertBefore()方法将一个节点添加到父节点的指定子节点前面。类似于css里面的before伪元素
5.6删除节点
- node.removeChild()方法从DOM中删除一个子节点,返回删除的节点
5.7复制节点(克隆节点)
-
node.cloneNode()方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点
-
注意:
- 如果括号参数为空或者false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点
- 如果括号参数为true,则是深度拷贝,会复制节点本身以及里面的所有的子节点
5.8三种动态创建元素区别
- document.write()
- element.innerHTML
- document.createElement()
- 区别
-
document.write是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
-
innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘
-
innerHTML创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
-
createElement()创建多个元素效率稍微低一点点,但是结构更清晰
-
总结:不同浏览器下,innerHTML效率要比creatElement高
六.DOM重点核心
- 关于dom操作,我们主要针对于元素的操作。主要有创建,增,删,改,查,属性操作,事件操作
6.1创建
- document.write
- innerHTML
- createElement
6.2增
- appendChild
- insertBefore
6.3删
- removeChild
6.4改
主要修改dom的元素属性,dom元素的内容,属性,表单的值等
- 修改元素属性:src,href,title等
- 修改普通元素内容:innerHTML,innerText
- 修改表单元素:value,type,disabled等
- 修改元素样式:style,className
6.5查
主要获取查询dom的元素
- DOM提供的API方法,getElementByld,getElementByTagName(古老用法不太推荐)
- H5提供的新方法:querySelector,querySelectorAll(提倡)
- 利用节点操作获取元素:父(parentNode),子(children),兄(previousElementSibling,nextElementSibling)(提倡)
6.6属性操作
主要针对于自定义属性
- setAttribute:设置dom的属性值
- getAttribute:得到dom的属性值
- removeAttribute移除属性
6.7事件操作
给元素注册事件,采取,事件源.事件类型=事件处理程序