1.DOM简介
文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。
- 文档:一个页面就是一个文档,DOM中使用doucument来表示
- 元素:页面中的所有标签都是元素,DOM中使用 element 表示
- 节点:网页中的所有内容都是节点(标签,属性,文本,注释等),DOM中使用node表示
2.获取元素
获取页面中的元素可以使用以下几种方式:
- 根据 ID 获取
- 根据标签名获取
- 通过 HTML5 新增的方法获取
- 特殊元素获取
2.2根据ID获取
使用 getElementByld() 方法可以获取带ID的元素对象doucument.getElementByld('id名')
<div id="time">2019-9-9</div><script>//使用 getElementByld() 方法可以获取带ID的元素对象var time = document.getElementById('time');console.log(time);// console.dir 打印我们的元素对象// 更好的查看里面的属性和方法console.dir(time);</script>
2.3根据标签名获取
根据标签名获取,使用 getElementByTagName() 方法可以返回带有指定标签名的对象的集合doucument.getElementsByTagName('标签名');document.getElementsByTagName('li');
<ul><li>知否知否,应是等你好久</li><li>知否知否,应是等你好久</li><li>知否知否,应是等你好久</li><li>知否知否,应是等你好久</li><li>知否知否,应是等你好久</li></ul><script>var lis = document.getElementsByTagName('li');console.log(lis);console.log(lis[0]);</script>
2.4根据标签名(父元素)获取
还可以根据标签名获取某个元素(父元素)内部所有指定标签名的子元素,获取的时候不包括父元素自己element.getElementsByTagName('标签名')ol.getElementsByTagName('li');
2.5通过H5新增方法获取
2.5.1getElementsByClassName
document.getElementsByClassName('类名');
2.5.2document.querySelector
querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素
document.querySelector('选择器');//// 切记里面的选择器需要加符号// 类选择器.box// id选择器 #navvar firstBox = document.querySelector('.box');
2.5.3document.querySelectorAll
querySelectorAll() 方法返回文档中匹配指定 CSS 选择器的所有元素
document.querySelectorAll('选择器');
querySelector 和 querySelectorAll 里面的选择器需要加符号,比如: document.querySelector(‘#nav’);
// 1. getElementsByClassName 根据类名获得某些元素集合var boxs = document.getElementsByClassName('box');console.log(boxs);// 2. querySelector返回指定选择器的第一个元素对象,切记里面的选择器需要加符号.box #navvar firstBox = document.querySelector('.box');console.log(firstBox);var nav = document.querySelector('#nav');console.log(nav);var li = document.querySelector('li');console.log(li);// 3. querySelectorAll()返回指定选择器的所有元素对象集合var allBox = document.querySelectorAll('.box');console.log(allBox);var lis = document.querySelectorAll('li');console.log(lis);
2.6获取特殊元素
2.6.1获取body元素
document.body
2.6.2获取html元素
document.documentElement
3.事件基础
JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。
网页中的每个元素都可以产生某些可以触发 JavaScript 的事件
3.1事件三要素
- 事件源(谁)
- 事件类型(什么事件)
事件处理程序(做啥)
<button id='btn'>唐伯虎</button><script>var btn = document.getElementById('btn');btn.onclick = function() {alert('点秋香');}</script>
3.2执行事件的步骤
获取事件源
- 注册事件(绑定事件)
- 添加事件处理程序(采取函数赋值形式)
var div = document.querySelector('div');div.onclick = function() {console.log('我被选中了');}
3.3鼠标事件
| 鼠标事件 | 触发条件 | | —- | —- | | onclick | 鼠标点击左键触发 | | onmouseover | 鼠标经过触发 | | onmouseout | 鼠标离开触发 | | onfocus | 获得鼠标焦点触发 | | onblur | 失去鼠标焦点触发 | | onmousemove | 鼠标移动触发 | | onmouseup | 鼠标弹起触发 | | onmousedown | 鼠标按下触发 |
4.操作元素
JavaScript 的 DOM 操作可以改变网页内容、结构和样式。
4.1改变元素内容
//innerText 不识别html标签 去除空格和换行element.innerText
//innerHTML 识别html标签 保留空格和换行的element.innerHTML
<div></div><script>var div = document.querySelector('div');div.innerText = '<strong>今天是:</strong> 2020';</script>
<div></div><script>var div = document.querySelector('div');div.innerHTML = '<strong>今天是:</strong> 2020';</script>
var p = document.querySelector('p');console.log(p.innerText);console.log(p.innerHTML);
4.2改变元素属性
<button id='hg'>胡歌</button><button id='xs'>许嵩</button><img src="images/hg.jpeg" ><script>var hg = document.getElementById('hg')var xs = document.getElementById('xs')var img=document.querySelector('img')hg.onclick=function(){img.src='images/hg.jpeg'}xs.onclick=function(){img.src='images/xs.jpg'}</script>
4.3改变表单属性
<button>按钮</button><input type="text" value="输入内容"><script>var btn = document.querySelector('button')var input = document.querySelector('input')btn.onclick=function(){input.value='我输入内容了'// btn.disabled=truethis.disabled=true}</script>
4.4排他思想
如果有同一组元素,我们相要某一个元素实现某种样式,需要用到循环的排他思想算法:
- 所有元素全部清除样式(干掉其他人)
- 给当前元素设置样式 (留下我自己)
- 注意顺序不能颠倒,首先干掉其他人,再设置自己
<button>按钮1</button><button>按钮2</button><button>按钮3</button><button>按钮4</button><button>按钮5</button><script>// 1. 获取所有按钮元素var btns=document.getElementsByTagName('button')// 2.btns得到的是伪数组 里面的每一个元素 btns[i]for(var i=0;i<btns.length;i++){btns[i].onclick=function(){for(var i = 0;i<btns.length;i++){//先把所有的按钮背景颜色去掉btns[i].style.background=''}//然后才让当前的元素背景颜色为pinkthis.style.background='pink'}}</script>
4.5.自定义属性
4.5.1获取属性值
获取内置属性值(元素本身自带的属性)
element.属性;
获取自定义的属性
element.getAttribute('属性');
4.5.2设置属性值
设置内置属性值
element.属性 = '值';
主要设置自定义的属性
element.setAttribute('属性');
4.5.2移除属性
element.removeAttribute('属性');
<body><div id="demo" index="1" class="nav"></div><script>var div = document.querySelector('div');// 1. 获取元素的属性值// (1) element.属性console.log(div.id);//(2) element.getAttribute('属性')//get得到获取 attribute 属性的意思 添加的属性我们称为自定义属性console.log(div.getAttribute('id'));console.log(div.getAttribute('index'));// 2. 设置元素属性值// (1) element.属性= '值'div.id = 'test';div.className = 'navs';// (2) element.setAttribute('属性', '值'); 主要针对于自定义属性div.setAttribute('index', 2);div.setAttribute('class', 'footer'); // class 特殊// 3.移除属性 removeAttribute(属性)div.removeAttribute('index');</script></body>
4.6.H5自定义属性
自定义属性目的:
- 保存并保存数据,有些数据可以保存到页面中而不用保存到数据库中
有些自定义属性很容易引起歧义,不容易判断到底是内置属性还是自定义的,所以H5有了规定
4.6.1 设置H5自定义属性
H5规定自定义属性 data-开头作为属性名并赋值
<div data-index="1"></div><script>var div = document.querySelector('div')div.setAttribute('data-index',1)</script>
4.6.2 获取H5自定义属性
兼容性获取 element.getAttribute(‘data-index’)
H5新增的:element.dataset.index 或element.dataset[‘index’]
<div data-index="1"></div><script>var div = document.querySelector('div')div.setAttribute('data-index',1)console.log(div.getAttribute('data-index'))//h5新增的获取自定义属性的方法 它只能获取data-开头的//dataset 是一个集合里面存放了所有以data开头的自定义属性console.log(div.dataset.index)console.log(div.dataset['index'])</script>
5.节点操作
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。
我们在实际开发中,节点操作主要操作的是元素节点
利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。5.1父节点
node.parentNode
<div class="demo"><div class="box"><span class="box1"></span></div></div><script>var box1=document.querySelector('.box1')//父节点 parentNode//到的是离元素最近的父级节点console.log(box1.parentNode)var box=document.querySelector('.box')console.log(box)</script>
5.2子结点
arentNode.childNodes(标准)parentNode.children(非标准)
parentNode.childNodes 返回包含指定节点的子节点的集合,该集合为即时更新的集合
- 返回值包含了所有的子结点,包括元素节点,文本节点等
- 如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes
- parentNode.children 是一个只读属性,返回所有的子元素节点
- 它只返回子元素节点,其余节点不返回 (这个是我们重点掌握的)
虽然 children 是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用
<ul><li>我是li</li><li>我是li</li><li>我是li</li><li>我是li</li></ul><script>// DOM 提供的方法(API)获取var ul = document.querySelector('ul')var lis = document.querySelectorAll('li')//子节点childNodes 所有的子节点 包含 元素节点 文本节点等等console.log(ul.childNodes)//children 获取所有的子元素节点 也是我们实际开发常用的console.log(ul.children)</script>
5.3.1第一个子结点
parentNode.firstChild
firstChild 返回第一个子节点,找不到则返回null
-
5.3.2最后一个子结点
parentNode.lastChild
<ul><li>我是li</li><li>我是li</li><li>我是li</li><li>我是li</li></ul><script>// DOM 提供的方法(API)获取var ul = document.querySelector('ul')//firstChild 第一个子节点 不管是文本节点还是元素节点console.log(ul.firstChild)console.log(ul.lastChild)console.log(ul.firstElementChild)console.log(ul.lastElementChild)</script>
实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢?
var ul = document.querySelector('ul')//firstChild 第一个子节点 不管是文本节点还是元素节点// console.log(ul.firstChild)console.log(ul.children[0])// console.log(ul.lastChild)console.log(ul.children[ul.children.length - 1])// console.log(ul.firstElementChild)// console.log(ul.lastElementChild)
5.3兄弟节点
5.3.1下一个兄弟节点
node.nextSibling
nextSibling 返回当前元素的下一个兄弟元素节点,找不到则返回null
-
5.3.2上一个兄弟节点
node.previousSibling
previousSibling 返回当前元素上一个兄弟元素节点,找不到则返回null
-
5.3.3下一个兄弟节点(兼容性)
node.nextElementSibling
nextElementSibling 返回当前元素下一个兄弟元素节点,找不到则返回null
-
5.4.4、上一个兄弟节点(兼容性)
node.previousElementSibling
previousElementSibling 返回当前元素上一个兄弟元素节点,找不到则返回null
- 有兼容性问题,IE9才支持
<div>我是div</div><span>我是span</span><script>var div = document.querySelector('div')//1.nextSibling 下一个兄弟节点 包含元素节点或者 文本节点等等console.log(div.nextSibling) //#textconsole.log(div.previousSibling) //#text//2. nextElementSibling 得到下一个兄弟元素节点console.log(div.nextElementSibling) //<span>我是span</span>console.log(div.previousElementSibling) //null</script>
5.4创建节点
document.createElement('tagName');
