Web前端开发学习笔记09--Web API:DOM

1、DOM 基础

DOM 简介:

  • 定义:文档对象模型,是处理可扩展编辑语言的标准编程接口,通过 DOM 接口可以改变网页的内容、结构和样式
  • 一个页面就是一个文档,DOM 中用 document 表示
  • 页面中的所有标签就是都是元素,DOM 中用 element 表示
  • 网页中的所有内容都是节点,DOM 中用node 表示
  • 获取过来的 DOM 元素都是一个对象

1.1 获取元素

  • 根据 ID 获取
var timer = document.getElementById('id');
  • 根据标签名获取:以伪数组形势存储的元素对象的集合
var timer = document.getElementByTagName('标签名');  
// 父元素必须是单个对象(必须指明),获取的时候不包括父元素自己
  • 根据类名获取:返回元素对象集合
var li = document.getElementByClassName
  • 根据选择器:返回指定选择器的第一个元素对象
var dh = document.querySelector('.box');  //类选择器

var nav = document.querySelector('#nav')  //id选择器

var all = document.querySelectorAll('box') //所有box
  • 获取特殊元素
1、document.body              //获取body元素
2、document.documentElement   //获取html元素

1.2 事件

事件三要素:事件源、事件类型、事件处理程序

执行步骤:1、获取事件源 2、注册事件 3、添加事件处理程序

<button> id="btn">按钮</button>
<script>
//1、获取事件源 事件别触发对象
var btn = document.getElementById('btn');
//2、注册事件 触发的方式:onclick
//3、添加事件处理程序
btn.onclick = function() {
  .....
}
</script>
  • 常见的鼠标事件
鼠标事件触发条件
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发

1.3 操作元素

  • 改变元素内容
element.innerText  // 从起始位置到终止位置的内容,不识别 html 标签,同时空格和换行也会去掉

element.innerHTML // 从起始位置到终止位置的全部内容,包括 html 标签,同时保留空格和换行
  • 修改元素属性:如src、href、id、alt、title 等
btn.onclick = function() {
  img.src = 'XXXXX';   //改变图片路径
}
  • 修改表单属性:type、value、checked、selected、disabled 等
<button>按钮</button>
<input type="text" value="内容">
<script>
var btn = document.querySelector('button');
var input = document.querySelecttor('input');
btn.onclick = function() {
  input.value = '修改的内容'; // 实现修改内容
  this.disabled = true; // 禁用
}
</script>
  • 修改样式属性

JS里面的样式采取驼峰命名法

1、element.style     //行内样式操作产生行内样式,css 权重比较高
2、element.className //类名样式操作:直接更改元素的类名,覆盖原先的类名

-排他思想:1、所有元素清除样式 2、给当前元素设置样式

  • 自定义属性操作:自定义属性以 ‘data-’ 开头作为属性名

获取元素:

element.属性;                   //获取内置属性值
element.getAttribute('属性');   //主要获取自定义属性
element.dataset.属性;           //自定义属性

设置属性值:

element.属性 = '值';          //内置属性值
element.setAttribute('属性','值'); //自定义属性

移除属性:

element.removeAttribute('属性');

1.4 节点操作

节点至少拥有nodeType、nodeName 和 nodevalue 三个基本属性

  1. 元素节点 nodeType 为1
  2. 属性节点 nodeType 为2
  3. 文本节点 nodeType 为3
  • 节点层级
父子节点含义
node.parentNode父级节点
parentNode.childNode返回包括指定节点的子节点集合,包括元素、文本节点
parentNode.children子节点,返回子元素节点
parentNode.firstChild返回第一个子节点,包含元素和文本节点(IE9+)
parentNode.firstElementChild返回第一个子元素节点
parentNode.lastChild返回最后一个子节点
parentNode.lastElementChild返回最后一个子元素节点(IE9+)
兄弟节点含义
node.nextSibling / node.previousSibling返回当前元素的下一个兄弟节点,包括所有节点
node.nextElementSibling下一个兄弟元素节点(IE9+)
node.previousElementSibling上一个兄弟元素节点(IE9+)

解决兼容性问题:

function() {
  var el = element;
  while (el = el.nextSibling) {
    if (el.nodeType ===1) {
      return el;
    }
  }
  return null;
}
  • 创建 、添加节点
方法说明
document.createElement(‘tagName’)原先元素不存在,由 tagName 指定 HTML 元素,故为动态创建节点
node.appendChild(Child)将一个节点添加到指定父节点的子节点的列表末尾
node.insertBefore(child,指定元素)将一个节点添加到父元素的指定子节点的前面
  • 删除、复制节点
方法说明
node.removeChild(child)从 DOM 中删除一个子节点,返回删除的节点
node.cloneNode()返回该方法的节点的一个副本,括号为空或 false 是浅拷贝,只复制标签;为 true 是深拷贝,复制节点本身以及节点里面左右的子节点
  • 三种动态创建元素区别
方法区别
document.write直接将内容分写入羽绒棉,但当文档执行完毕,会导致页面重绘
element.innerHTML创建多个元素效率更高(采取数组形式拼接)
document.createElement()创建多个元素效率低一些,但结构更清晰

2、DOM 重点核心

2.1 注册事件(绑定事件)

  • 传统注册方式

利用 on 开头的事件,如 onclick:btn.onclick = function() {}

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

  • 方法监听注册方式:addEventListener 监听方式
evenTarget.addEventListener(type,listener[, useCapture])   
// 将指定的监听器注册到evenTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数

参数:

type:事件类型字符串,比如 click、mouseover 等
listener:事件处理函数,事件发生时,会调用该监听函数
useCapture:可选参数,一个布尔值,默认是 false

特点:同一个元素同一个事件可以注册多个监听器,按注册顺序执行(IE9+,IE9以前用 attachEvent() 代替)

  • attachEvent 监听方式
eventTarget.attachEvent(eventNameWithOn,callback)

参数:

eventNameWithOn:事件类型字符串,比如 onclick、onmouseover 等
callback:事件处理函数,当目标触发事件时回调函数被调用

2.2 删除事件(解绑事件)

  • 传统方式
eventTarget.onclick = null;
  • 方法监听方式
1、eventTarget.removeEventListener(type,listener[,useCapture]); // 事件处理函数不能为匿名函数
2、eventTarget.detachEvent(eventNameWithOn,callback);

2.3 DOM 事件流

事件流描述的是从页面中接受事件的顺序,事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即 DOM 事件流。

  1. 事件捕获:由 DOM 最顶层节点开始,然后逐级向下传播到最具体的元素接收的过程

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

  3. JS 代码只能执行捕获或者冒泡其中的一个阶段

  4. onclick 和 attachEvent 只能得到冒泡阶段

  5. 如果addEventListener 第三个参数是 true,表示在事件捕获阶段调用事件处理程序;如果是 false ,表示在事件冒泡阶段调用处理程序

  6. 实际开发中很少使用事件捕获,更关注事件冒泡

  7. 有些事件没有冒泡,如 onblur、onfocus、onmouseenter、onmouseleave

在这里插入图片描述

2.4 事件对象

  • 什么是事件对象:event 对象代表事件的状态,比如鼠标的位置

事件发生后,跟事件相关的一系列信息数据的集合都被放到这个对象里面,这个对象就是事件对象 event,它有很多属性和方法。

<div></div>
<script>
  var div = document.querySelector('div');
  div.onclick = function(event) {}
  // 1、event 就是一个事件对象,当形参来看
  // 2、事件对象只有有了事件才会存在,系统自动创建,不需要我们传递参数
  // 3、事件对象是事件的一系列相关数据的集合,比如鼠标点击里面包含了鼠标的相关信息
  // 4、事件对象也可以自己命名
  // 5、兼容性问题:IE678 通过 window.event ,
</script>
  • 事件对象常见的属性和方法
事件对象属性方法说明
e.target返回触发事件的对象 / 元素(标准)
e.srcElement返回触发事件的对象(IE6~8)
e.type返回事件类型,比如 click,不带 on
e.cancelBubble该属性阻止冒泡(IE6~8)
e.returnValue该属性阻止默认事件(IE6~8),比如不让链接跳转
e.preventDefault()该方法阻止默认事件(标准,如不让链接跳转
e.stopPropagation()阻止冒泡(标准)
  1. e.target 和 this 的区别:e.target 返回的是触发事件的元素,this 返回绑定事件的元素
  2. return false 也可以阻止默认行为(仅限于传统注册方式)

2.5 阻止事件冒泡

  • 标准写法

利用事件对象里面的 stopPropagation() 方法

  • 阻止事件冒泡的兼容性方案
if (e && e.stopPropagation) {
  e.stopPropagation();
}else {
  window.event.cancelBubble = ture;
}

2.6 事件委托

  • 原理:监听事件设置在其父节点上,然后利用冒泡原理影响设置的每个子节点

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

var ul = document.querySelector('ul');
ul.addEventListener('click',function(e){
  e.target.style.backgroundColor = 'red'; // 此操作会让 ul 中的 li 背景变红
})

2.7 常用的鼠标事件

  • 鼠标事件
鼠标事件触发条件
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发
  • 鼠标事件对象:MouseEvent
鼠标事件对象说明
e.clientX返回鼠标相对于浏览器窗口可视区的 X 坐标
e.clientY返回鼠标相对于浏览器窗口可视区的 Y 坐标
e.pageX返回鼠标相对于文档页面的 X 坐标(IE9+)
e.pageY返回鼠标相对于文档页面的 Y 坐标(IE9+)
e.srceenX返回鼠标相对于电脑屏幕的 X 坐标
e.srceenY返回鼠标相对于电脑屏幕的 Y 坐标
  • 键盘事件

注意:
1、如果使用 addEventListener 不需要加 on
2、三个事件执行顺序是:keydown — keypress — keyup

键盘事件说明
onkeyup某个键盘按键被松开时触发
onkeydown某个键盘按键被按下时触发
onkeypress某个键盘按键被按下时触发,但它不能识别 功能键
  • 键盘事件对象

注意:onkeydown 和 onkeyup 不区分大小写字母,onkeypress 区分大小写字母

键盘事件对象属性说明
keyCode返回该键的 ASCII 值
  • 禁止鼠标右键菜单

contextmenu 主要控制应该何时访问上下文菜单,主要用于取消默认的上下文菜单

document.addEventListener('contextmenu',function(e) {
  e.preventDefault;
})
  • 禁止鼠标选中文字

selectstart :开始选中

document.addEventListener('selectstart',function(e) {
  e.preventDefault;
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值