前端学习 9 dom操作和事件

### BOM

#### 操作浏览器的方法

- 浏览器窗口的尺寸(包含滚动条的)

  + innerWidth

  + innerHeight

- 浏览器的地址栏操作

  + location

    + href

      + location.href

    + reload() 刷新

- 浏览器的历史记录

  + history

    + back()

    + forward()

    + go(n)

- 浏览器的信息

  + navigator

    + userAgent

    + appName

    + appVersion

    + platform

- 浏览器的常见事件

  + onload

  + onscroll

  + onresize

    + 窗口改变的事件

- 获取浏览器卷去的高度和宽度

  + docuemnt.documentELement.scrollTop || document.body.scrollTop

  + docuemnt.documentElement.scrollLeft || document.body.scrooLeft

- window.open()

  + 打开一个新的窗口开启页面

- window.close()

  + 关闭当前页面

### 元素

#### 元素的属性操作

标签的属性:  属性名=属性值

- 标签属性的分类

  - 1. 原生属性

    - 在W3C规范中定义好的属性名

    - 比如: id,class,style, 表单标签中 value,name,checked

  - 2. 自定义属性

    - 我们自己写到标签上的属性

    - 比如: 页面中div的index属性

  - 3. H5自定义属性

    - 目的: 为了规范自定义属性的写法

    - 在标签的H5自定义属性:  data-属性名 = 属性值

元素的属性操作

- 1. 原生属性的操作  直接通过点语法操作

  - 获取属性值: 元素.属性名

  - 设置属性: 元素.属性名 = 值

- 2. 自定义属性属性的操作

  - 获取: 元素.getAttribute('属性名')

  - 设置修改: 元素.setAttribute('属性名','值')

  - 移除: 元素.removeAttribute(属性名)

- 3. H5自定义属性操作

  - 每一个标签元素都有一个dataset属性

  - 这个属性的值是一个对象,此对象可以操作这个标签的所有H5自定义属性

  - 元素.dataset会得到一个操作标签H5自定义属性的对象

    + 获取: 元素.dataset.属性名

    + 设置: 元素.dataset.属性名 = 值

    + 移除: delete 元素.dataset.属性名

#### 元素的样式操作

1. 获取行内样式

  - 语法: 元素.style.样式名

2. 获取行内非行内样式(行内,非行内都可以获取)

  - 语法1: window.getComputedStyle(元素).样式名   低版本ie不能使用  

  - 语法2: 元素.currentStyle.样式名    只能在低版本ie中使用(只能获取非行内)

  - 兼容写法(能力测试兼容写法)

  ```js

  if(window.getComputedStyle){

     var res = window.getComputedStyle(div).width

   }else{

     var res = div.currentStyle.width

   }

   console.log( res )

  ```

3. 设置样式(只能设置行内样式)  

  - 语法: 元素.style.样式名 = 样式值

  - 注意: 如果是多个单词组成的样式名,

    1. 在js中使用驼峰写法    backgroundColor

    2. 使用数组关联法中字符串表示 ['background-color']

#### 元素的类名操作

- 目的: 为了可以批量的操作元素的样式

- 1. className

  - 语法: 元素.className

  - 本质上就是元素的原有属性操作

  - 因为class是js中的关键字,所以改为className使用

- 2. classList

  - 元素.classList返回一个可以操作元素所有类名的 伪数组的集合

  - 这个集合对象有操作类名的方法

  - add(类名)  添加类名

  - remove(类名) 移除类名

  - toggle(类名) 类名切换

  + 如果存在则移除,不存在则添加

### DOM

#### 操作文档的方法

- 获取页面中的元素

  + getElementById()

  + getElementsByTagName()

  + getElementsByClassName()

  + querySelector()

  + querySelectorAll()

- 一些特殊标签的获取

  + document.body

  + document.head

  + document.title

  + document.documentELement  

    + 获取html标签

- 操作 DOM 元素的属性

  + innerHTML

  + innerText

  + value    表单标签

  + style

  + className

  + id

  + getAttribute()

  + setAttribute()

  + removeAttribute()

- 获取 DOM 元素节点的方法

  + childNodes

  + children

  + firstChild

  + firstELementChild

  + lastChild

  + lastElementChild

  + previousSibling

  + previousElementSibling

  + nextSibling

  + nextElementSibling

  + parentNode

  + parentElement

  + attributes

- DOM 节点的属性

  + 元素节点

    + nodeType === 1

    + nodeName === 大写标签名

    + nodeValue === null

  + 属性节点

    + nodeType === 2

    + nodeName === 属性名

    + nodeValue === 属性值

  + 文本节点

    + nodeType === 3

    + nodeName === #text

    + nodeValue === 文本内容

  + 注释节点

    + nodeType === 8

    + nodeName === #comment

    + nodeValue === 注释内容

#### 创建节点 DOM 元素

  + createELement()

  + createTextNode()

#### 插入节点 DOM 元素  

  + appendChild()

  + insertBefore()

#### 删除节点 DOM 元素  

  + removeChild()

  + remove

#### 替换节点 DOM 元素

  + replaceChild()

#### 克隆节点 DOM 元素

  + cloneNode()

    + 参数是 false 的时候只克隆自己

    + 参数是 true 的时候连带所有后代元素全部克隆

#### 获取非行内样式

  + window.getComputedStyle().样式   IE 9 以上版本使用

    + 第二个参数默认是 null

    + 可以传递 `after` || `before`,用于获取伪元素的样式

  + currentStyle    IE 8 及一下使用

### 元素操作

#### 元素的尺寸问题

  + clientWidth || clientHeight

    + 内容 + padiing

  + offsetWidth || offsetHeight

    + 内容 + padding + border

#### 获取元素偏移量

  + offseParent 获取元素的定位父级

  + offsetLeft || offsetTop

    + 没有定位的时候根据结构父级来计算偏移量

    + 有定位的时候根据定位父级来计算偏移量

  + 元素.clientLeft 获取元素左边框的宽度

  + 元素.clientTop 获取元素上边框的宽度

###  浏览器可视窗口的尺寸

  +  在BOM中获取浏览器可视窗口的尺寸   包含滚动条

    +  window.innerWidth   获取窗口的宽度

    +  window.innerHeight  获取窗口的高度

  +  在DOM中获取浏览器可视窗口的尺寸  不包含滚动条

    +  document.documentElement.clientWidth

    +  document.documentElement.clientHeight

### 事件三个组成部分

  + 事件源: 绑定在谁身上的事件

  + 事件类型: 什么事件

  + 事件处理函数: 触发事件的时候做什么

### 事件对象

  + 浏览器给我们提供的一个 黑盒子

  + 存储着一些事件的信息

  + `e = e || window.event`

### 事件对象里面有三组坐标点

  + clientX || clientY   相对于浏览器窗口

  + offsetX || offsetY   相对于元素

  + pageX || pageY   相对于页面

### 常见的事件

#### 鼠标事件

    + click       鼠标左键单击

    + dblclick    鼠标左键双击

    + mousemove   鼠标移动事件

    + mouseenter  鼠标移入事件

    + mouseout    鼠标移出事件

    + mousedown   鼠标按下事件

    + mouseup     鼠标松开事件

    + contextmenu 鼠标右键点击事件

#### 键盘事件

    + keydown    键盘按下  

    + keypress   键盘按下 键盘中的系统功能按键不能触发keypress事件

    + keyup      键盘抬起

#### 浏览器事件

    + load--------页面加载事件,当页面中所有的资源都加载完毕之后会触发的事件

    + scroll------页面滚动事件,当页面中的滚动条滚动的时候触发

    + resize------页面窗口变化,当可视窗口大小发生变化的时候触发

#### 表单事件

    + input      输入事件

    + change     内容改变事件(内容改变,并且失去焦点的时候触发)

      + 一遍表单的  内容输入框不会使用change事件

        + 表单的select和文件上传的时候会使用

    + focus  

    + blur

#### 触摸事件

    + touchstart   触摸开始的时候触发

    + touchmove    触摸移动的时候触发

    + touchend     触摸结束的时候触发

#### 其他事件

    + selectStart  鼠标选中事件

    + visibilitychange  页面选项卡切换 (离开页面事件)

### 键盘事件里面

    + 通过键盘码来确定你按下的是哪一个按键

    + `e.keyCode || e.which`

### 键盘组合事件

    + altKey

    + ctrlKey

    + shiftKey

### 事件的绑定方式

  1. on事件类型 = function () {}

  2. 元素.addEventListener('事件类型', function () {})

  3. 元素.attachEvent('on事件类型',function () {})

### 事件的传播

    + 从准确点击的元素,按照结构父级一直到window的同类型事件都会被触发

### 冒泡捕获和目标

    + 目标: 准确点击的元素

      + 事件对象.target || 事件对象.srcElement

    + 冒泡: 从目标到 window 依次执行同类型事件

    + 捕获: 从 window 到 目标依次执行同类型事件

### 阻止事件传播

    + `e.cancelBubble = true`

    + `e.stopPropagation()`

### 浏览器的默认行为

    + 不需要我们绑定事件,自己就会有行为发生

#### 阻止默认事件

    + `e.preventDefault()`

    + `e.returnValue = false`

    + `return false;`

#### 利用事件冒泡的机制可以做事件委托

    + 把元素的事件绑定给传播路径上的某一个结构父级

    + 在事件里面使用 `e.target` 来判断是不是点击的元素

### 正则

    + 专门用来检测字符串的表达式

    + 是一个引用数据类型

#### 元字符

    + \d

    + \D

    + \s

    + \S      

    + \w

    + \W

    + .   (\n)

#### 限定符

    + *

    + +

    + ?

    + {n}

    + {n,}

    + {n,m}

#### 边界符

    + ^

    + $

#### 标识符

    + 写在正则外边的东西

    + g

    + i

#### 正则的方法

    + test()  匹配

    + exec()  捕获

#### 字符串和正则合作的方法

    + replace()

    + search()

    + match()

    + 在没有标识符的时候,和 exec 一样

    + 如果有标识符 g,就会返回一个数组,里面是字符串中满足要求的所有项

### ES6

    语法进化中的一部分

#### let || const

  + 他们和 var 的却别

    1. 不允许重复声名同一个变量

    2. 不进行预解析,必须先声明后使用

    3. 任意以一个可以书写代码段的 {} 都能显示使用范围

  + 他们两个的区别

    1. let 声名的变量可以改变,const 声名的常量不能改变

    2. let可以以不赋值,const 声名的时候必须赋值,一经赋值不能更改

#### 箭头函数

  + 是对函数表达式的简写

  + **声名式函数不能简写**

- 箭头函数的使用规则

  + 一个参数的时候 () 可以不写

  + 一句话的时候 {} 可以不写,并且会自动 return

- 箭头函数的注意点

  + 箭头函数里面没有 this,箭头函数的 this 在书写的时候就定义好了

  + 箭头函数没有 arguments

- 函数的形参可以给一个默认值

  + `function fn(a = 10) {}`

  + `let fn = (a=10)=>{}`

  + **箭头函数如果要写参数默认值那么必须加 ()**

#### 模板字符串

  + 使用反引号来包裹

  + 和单引号他·双引号字符串的区别

    + 可以换行书写

    + 可以在字符串里面使用 ${  变量  } 的形式直接添加变量

#### 解构赋值

  + {} 解构对象 `let {name:username} = obj`  相当于`let usernmae = obj.name`

  + [] 解构数组  `let [n1,n2,n3,n3] = [1,2,3,4]`

  + 不能混着使用

#### ... 运算符号

  + 直接使用和在实参的位置的时候式展开运算

  + 在形参的位置使用的时候式合并运算

    + let f  = (...arg)=>{}

    + f(1,2,3,4,5,6)

#### this的指向

  + 普通函数      window

  + 事件处理函数   事件源

  + 定时器函数  window

  + 自调用函数  window

  + 对象方法函数  对象

- 改变函数中this的方法

  + call(改变后this的指向,实参列表)

  + apply(改变后this的指向,[实参列表])

  + bind(改变后新函数中this的指向)

### 运动函数

  1. 简单的运动函数

  2. 多属性的运动函数

  3. 多属性一起均匀的运动函数

    之前是通过 当前距离+5  固定值

    (目标距离-当前距离)/10  始终无法到到目标,会有小数的计算

      向左运动  是负数,负数取整,向下取整,

      向右运动,是正数,向上取整

  4. 透明度,通过将透明度放大100倍进行计算,然后再讲最后的结果除100

  5. 运动结束后,通过将定时器id存储在对象中,判断所有定时器结束,才是运动结束

#### 面向对象

  + 是一个开发的思想

  + 当我需要完成一个功能的时候,写一个构造函数,创建对象,让对象完成从功能

#### 构造函数的书写

  + 构造函数的作用创建对象

  + 注意事项:

  1. 首字母大写

  2. 必须要和 new 连用,不和 new 连用的时候没有创造对象的能力

  3. 不传递参数的时候可以不写 (),建议书写

  4. 建议不要写 return

    如果 return 一个基本数据类型,那么写了白写

    如果 return 一个引用数据类型,那么构造函数白写

#### 构造函数的书写内容

  + 属性都写在构造函数体内

  + 方法都写在构造函数的 prototype 上

- 构造函数中的 this 指向

  + 构造函数体内的 this 指向实例

  + prototype 上的方法中 this 指向实例

- 对象的访问机制

  + 当你访问一个对象的属性的时候

  + 先在自己身上查找,如果自己有直接使用,停止查找

  + 如果没有,就去 `__proto__` 上查找,如果有就拿来使用,停止查找

  + 如果还没有,就再去 `__proto__` 上查找

  + 一直到 Object.prototype 上都没有,那么返回 undefiend

  + 由 `__proto__` 串联起来的对象链状结构就叫做 **原型链**

#### 面向对象编程

  + 写一个构造函数

  + 把需要用到的属性写在构造函数体内

  + 把需要用的方法写在 prototype 上

  + 使用方法去操作属性完成功能

  + new 构造函数

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值