文档对象模型(Document Object Model,简称 DOM)
,是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口DOM在我们实际开发中主要用来操作元素,获取页面中的元素可以使用以下几种方式:
使用 getElementByld()
方法可以获取带ID的元素对象
//使用 console.dir() 可以打印我们获取的元素对象,更好的查看对象里面的属性和方法
doucument.getElementByld('id名')2019-9-9
根据标签名获取,使用 getElementByTagName()
方法可以返回带有指定标签名的对象的集合
doucument.getElementsByTagName('标签名');
- 知否知否,应是等你好久
- 知否知否,应是等你好久
- 知否知否,应是等你好久
- 知否知否,应是等你好久
- 知否知否,应是等你好久
还可以根据标签名获取某个元素(父元素)内部所有指定标签名的子元素,获取的时候不包括父元素自己
element.getElementsByTagName('标签名')ol.getElementsByTagName('li');
注意:父元素必须是单个对象(必须指明是哪一个元素对象),获取的时候不包括父元素自己
1.getElementsByClassName:根据类名返回元素对象合集
document.getElementsByClassName('类名');
2.document.querySelector:根据指定选择器返回第一个元素对象
document.querySelector('选择器');// 切记里面的选择器需要加符号
// 类选择器.box
// id选择器 #nav
var firstBox = document.querySelector('.box');
3.document.querySelectorAll:根据指定选择器返回所有元素对象
document.querySelectorAll('选择器');
注意:querySelector和
querySelectorAll里面的选择器需要加符号,比如:
document.querySelector(‘#nav’);
//获取body元素
document.body;
//获取html元素
document.documentElement;
JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容 、属性等。注意以下都是属性
从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉
element.innerText
起始位置到终止位置的全部内容,包括HTML标签,同时保留空格和换行
element.innerHTML
我是文字123
// img.属性
img.src = "xxx";input.value = "xxx";
input.type = "xxx";
input.checked = "xxx";
input.selected = true / false;
input.disabled = true / false;
我们可以通过 JS 修改元素的大小、颜色、位置等样式
//行内样式操作
// element.style
div.style.backgroundColor = 'pink';
div.style.width = '250px';//类名样式操作
// element.className//案例:
文本
如果有同一组元素,我们相要某一个元素实现某种样式,需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
1.获取内置属性值(元素本身自带的属性)
element.属性;
2.获取自定义的属性
element.getAttribute('属性');
3.设置内置属性值
element.属性 = '值';
4.主要设置自定义的属性
element.setAttribute('属性','值');
5.删除属性
element.removeAttribute('属性');
综合案例:
自定义属性目的:
H5规定自定义属性 data-
开头作为属性名并赋值:
// 或者使用JavaScript设置
div.setAttribute('data-index',1);
获取H5自定义属性:
element.getAttribute('data-index')
element.dataset.index
或element.dataset['index']
IE11才开始支持
这两种方式都可以获取元素节点,我们后面都会使用,但是节点操作更简单,一般的,节点至少拥有三个基本属性
- 网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示
- HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除
一般的,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性:
- 元素节点:nodeType 为1
- 属性节点:nodeType 为2
- 文本节点:nodeType 为3(文本节点包括文字、空格、换行等)
我们在实际开发中,节点操作主要操作的是元素节点
利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系
parentNode
属性可以返回某节点的父结点,注意是最近的一个父结点我是div我是span- 我是li
- 我是li
- 我是li
- 我是li
×
parentNode.childNodes
返回包含指定节点的子节点的集合,该集合为即时更新的集合
返回值包含了所有的子结点,包括元素节点,文本节点等
如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes
parentNode.children
是一个只读属性,返回所有的子元素节点
它只返回子元素节点,其余节点不返回 (这个是我们重点掌握的)
虽然 children 是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用
- 我是li
- 我是li
- 我是li
- 我是li
- 我是li
- 我是li
- 我是li
- 我是li
firstChild
: 返回第一个子节点,找不到则返回null,同样,也是包含所有的节点lastChild
: 返回最后一个子节点,找不到则返回null,同样,也是包含所有的节点firstElementChild
: 返回第一个子节点,找不到则返回null,有兼容性问题,IE9以上才支持lastElementChild
: 返回最后一个子节点,找不到则返回null,有兼容性问题,IE9以上才支持第一个子元素节点:parentNode.chilren[0]
、最后一个子元素节点:parentNode.chilren[parentNode.chilren.length - 1]
- 我是li1
- 我是li2
- 我是li3
- 我是li4
- 我是li5
document.createElement()
方法创建由 tagName 指定的HTML 元素- 因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点
document.createElement('tagName');
node.appendChild()
方法将一个节点添加到指定父节点的子节点列表末尾。类似于 CSS 里面的 after 伪元素node.appendChild(child) //添加节点 node.insertBefore(child,指定元素)
案例:
- 123
node.removeChild()
方法从 DOM 中删除一个子节点,返回删除的节点node.removeChild(child)
node.cloneNode()
方法返回调用该方法的节点的一个副本。 也称为克隆节点/拷贝节点node.cloneNode() //如果括号参数为空或者为 false ,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点 //如果括号参数为 true ,则是深度拷贝,会复制节点本身以及里面所有的子节点
- 1111
- 2
- 3
对于DOM操作,我们主要针对子元素的操作,主要有:创建、增加、删除、修改、查找、属性操作、时间操作
- 创建:doucment.write、innerHTML、createElement
- 增加:appendChile、insertBefore
- 删除:removeChild
- 修改:主要修改dom的元素属性,dom元素的内容、属性、表单的值等
- 修改元素属性:src、href、title 等
- 修改普通元素内容:innerHTML、innerText
- 修改表单元素:value、type、disabled
- 修改元素样式:style、className
- 查找:主要获取查询dom的元素
- DOM提供的API方法:getElementById、getElementsByTagName (古老用法,不推荐)
- H5提供的新方法:querySelector、querySelectorAll (提倡)
- 利用节点操作获取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling) 提倡
- 属性操作:主要针对于自定义属性
- setAttribute:设置dom的属性值
- getAttribute:得到dom的属性值
- removeAttribute:移除属性
1.addEventListener事件监听方式:
eventTarget.addEventListener()
方法将指定的监听器注册到 eventTarget(目标对象)上eventTarget.addEventListener(type,listener[,useCapture])
该方法接收三个参数:
type
:事件类型字符串,比如click,mouseover,注意这里不要带onlistener
:事件处理函数,事件发生时,会调用该监听函数useCapture
:可选参数,是一个布尔值,默认是 false
2.attachEvent事件监听方式:
eventTarget.attachEvent()
方法将指定的监听器注册到 eventTarget(目标对象)上eventTarget.attachEvent(eventNameWithOn,callback)
该方法接收两个参数:
eventNameWithOn
:事件类型字符串,比如 onclick 、onmouseover ,这里要带 oncallback
: 事件处理函数,当目标触发事件时回调函数被调用3.注册事件兼容性解决方法
兼容性处理的原则:首先照顾大多数浏览器,再处理特殊浏览器
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;}
1.removeEventListener删除事件方式
eventTarget.removeEventListener(type,listener[,useCapture]);
该方法接收三个参数:
type
:事件类型字符串,比如click,mouseover,注意这里不要带onlistener
:事件处理函数,事件发生时,会调用该监听函数useCapture
:可选参数,是一个布尔值,默认是 false。学完 DOM 事件流后,我们再进一步学习2.detachEvent删除事件方式
eventTarget.detachEvent(eventNameWithOn,callback);
该方法接收两个参数:
eventNameWithOn
:事件类型字符串,比如 onclick 、onmouseover ,这里要带 oncallback
: 事件处理函数,当目标触发事件时回调函数被调用3.传统事件删除方式
eventTarget.onclick = null;
123
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;
}
123
e.target 和 this 的区别:
123百度
标准写法:
e.stopPropagation();
非标准写法: IE6-8 利用对象事件 cancelBubble属性
e.cancelBubble = true;
son儿子
//阻止事件冒泡的兼容性解决方案
if(e && e.stopPropagation){e.stopPropagation();}else{window.event.cancelBubble = true;}
- 知否知否,点我应有弹框在手!
- 知否知否,点我应有弹框在手!
- 知否知否,点我应有弹框在手!
- 知否知否,点我应有弹框在手!
- 知否知否,点我应有弹框在手!
补充:禁止鼠标右键与鼠标选中
**contextmenu
主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单**selectstart
禁止鼠标选中我是一段不愿意分享的文字
onkeypress
和前面2个的区别是,它不识别功能键,比如左右箭头,shift 等
onkeydown
和 onkeyup
不区分字母大小写,onkeypress
区分字母大小写Keypress
不识别功能键,但是keyCode
属性能区分大小写,返回不同的ASCII值