[TOC]
## 注册事件的三个方式
### 1.带on的事件
常用的带on的事件有onclick,onmourseover,onmouseout,onblur,onfocus,mousewheel等
*****
**注意**
对同一个按钮做多个点击事件的时候会有bug,不支持事件重写,先写的会被覆盖
```
my$("btn").onclick = function () {
console.log("ajdo");
};
```
#### mousewheel事件
(用户通过鼠标滚轮与页面交互、在垂直方向上滚动页面时,就会触发mousewheel事件)
1.1 “mousewheel” 事件中的 “event.wheelDelta” 属性值:返回的值,如果是正值说明滚轮是向上滚动,如果是负值说明滚轮是向下滚动;返回的值,均为 120 的倍数,即:幅度大小 = 返回的值 / 120。
2.2 “DOMMouseScroll” 事件中的 “event.detail” 属性值:返回的值,如果是负值说明滚轮是向上滚动(与 “event.wheelDelta” 正好相反),如果是正值说明滚轮是向下滚动;返回的值,均为 3 的倍数,即:幅度大小 = 返回的值 /
*****
### 2.addEventListener
格式:对象.addEventListener(“不带on的事件类型”,事件处理函数,false) **ie8不支持**
true:事件捕获 (添加事件时一般用false)
false:事件冒泡
```
my$("btn").addEventListener("click",function () {
console.log("第一个事件");
},false);
```
### 3.attachEvent
格式:对象.attachEvent(“事件类型”,事件处理函数)
**谷歌和火狐不支持 不过在框架中已经做了兼容**
```
my$("btn").attachEvent("onclick",function () {//谷歌和火狐不支持
console.log("我是第一个点击事件");//审查元素会报错
})
```
## 事件的解绑方式
对象使用什么方式绑定事件就用什么方式解绑事件,解绑后的事件不起作用
### 1带on的事件解绑
格式:
事件源.on事件名字=事件处理函数--->绑定事件
事件源.on事件名字=null;
```
my$("btn").onclick = function () {
console.log("我是绑定事件");
};
my$("btn2").onclick = function () {
my$("btn").onclick = null;/*使得绑定事件的值为空 带on的事件*/
}
```
### 2.removeEventListener
使用这个解绑事件时,对匿名函数是不起作用的。倘若绑定事件中使用了匿名函数,则需要将匿名函数变为命名函数才可以进行解绑
格式:
事件源.addEventListener("没有on的事件类型",命名函数,false);---绑定事件
```
function f1() {
console.log("第一个");
}
function f2() {
console.log("第二个");
}
my$("btn").addEventListener("click",f1,false);
my$("btn").addEventListener("click",f2,false);
//点击第二个按钮把第一个按钮的第一个点击事件解绑
my$("btn2").onclick = function () {
my$("btn").removeEventListener("click",f1,false);
}
```
### 3. detachEvent
**IE8才支持**
格式:
事件源.attachEvent("on事件类型",命名函数);---绑定事件
事件源.detachEvent("on事件类型",函数名字);
```
function f1(){
console.log("nasl");
}
my$("btn").attachEvent("onclick",f1);/*绑定事件 IE8可以用*/
my$("bnt2").onclick = function () {
my$("btn").detachEvent("onclick",f1);/*解绑*/
}
```
## 事件的三个阶段
在JavaScript中,事件有以下三个阶段
第一阶段:捕获阶段
代表数字是1,从外到里执行
第二阶段:目标阶段(执行当前点击的元素)
代表数字是2,当前执行的元素
第三阶段:冒泡阶段
代表数字是三,从里到外
*****
eventPhase属性返回事件传播的当前阶段,返回的为1 2 3常量
1,代表捕获阶段
2,代表目标阶段,即当前被执行的元素
3,代表冒泡阶段
```
<script>
functionmy$(id){
returndocument.getElementById(id);
}
vararr\= \[my$('id1'),my$('id2'),my$('id3')\];
// 冒泡阶段执行的事件
for(vari\=0;i<arr.length;i++){
arr\[i\].addEventListener('click',function(e){
console.log(this.id+'\-----'+e.eventPhase)
},false)
}
// 捕获阶段阶段执行的事件
for(varj\=0;i<arr.length;j++){
arr\[j\].addEventListener('click',function(e){
console.log(this.id+'\-----'+e.eventPhase)
},ture)
}
</script>
```
### 捕获阶段
![](https://img.kancloud.cn/e1/13/e113dd0a93800870665bab08972adca3_575x357.png)
### 冒泡阶段
![](https://img.kancloud.cn/19/40/1940d10eeb6f5c5149dc620335b2c200_564x350.png)
事件冒泡的条件:
有盒子嵌套 每一个盒子有相同的事件
触发里面的 盒子身上的事件,外面的盒子上面的事件也会被触发
```
~~~
<body>
<div id="dv1">
<div id="dv2">
<div id="dv3"></div>
</div>
</div>
</body>
<script>
my$("dv3").onclick = function () {
console.log(this.id);
};
my$("dv2").onclick = function () {
console.log(this.id);
};
my$("dv1").onclick = function () {
console.log(this.id);
};
</script>
//小小的测试题
document.body.onclick = function () {//因为事件冒泡了,所有body也会被冒泡触发了。
console.log("看我body有没有被触发");/*body的高度是根据里面的盒子来决定的。*/
}
~~~
```
### 阻止事件冒泡 stopPropagation
阻止事件冒泡,谁要阻止就赋予谁
e.stopPropagation();/* 兼容谷歌和火狐*/
e.cancelBubble = true;/*兼容ie8 */
*****
(e--是event的简写,是当DOM 树中某个事件被触发的时候,会自动产生一个用来描述事件所有的相关信息的对象,这个对象就是event(事件对象);
可通过window.event/event来获取。非IE还可以通过函数传参的形式来使用,一般而言我们使用【形参e或eve】来代替使用;))
*****
```
my$("dv3").onclick = function (e) {
e.stopPropagation();/*阻止事件冒泡 谁要阻止就给谁加 兼容谷歌和火狐*/
e.cancelBubble = true;/*阻止事件冒泡 IE*/
console.log(this.id);
};
```
## 事件委托
1、事件委托:原理就是事件冒泡。此处的事件委托是,当li被点击时,li并没有做事件处理,而是委托ul做了事件处理,ul事件中可以使用事件对象e获取target属性,完成事件处理。
2、事件对象(事件处理函数的参数e)
```
<ul id="ul">
<li>西施</li>
<li>貂蝉</li>
<li>昭君</li>
<li>凤姐</li>
<li>芙蓉姐姐</li>
</ul>
//事件冒泡的应用(事件委托)
my$('ul').onclick = function (e) {
//e是事件对象,通过事件对象可以获取到触发事件的真正的元素相关的信息
//e.target:获取真正触发事件的那个元素
var target = e.target;
target.style.backgroundColor='lightblue';
}
//
对li做点击事件的话需要循环五次,所以把事情委托给了ul,然后通过e.target找到真正的目标
```
- Javascript
- 组成
- Web API
- 初步认识DOM
- 经典案例 (使用获取id的方法)
- 节点和元素
- 经典案例 (使用获取节点和元素的方法)
- 函数
- 作用域链
- Array对象的方法
- String对象的方法
- 绑定事件
- 事件委托
- 逻辑运算
- js高级(面向对象、)
- 基本知识
- 数据类型
- 基本包装类型的使用
- 定义变量的区别
- JavaScript对象的动态特性
- 关键字in
- 关键字delete
- 运算符
- 创建对象的方式
- 回调函数
- 高阶函数
- 构造器属性
- this指向
- hasOwnProperty属性
- 私有成员和特权方法
- 面向对象和面向过程的基础
- 异常捕获
- 构造函数和普通函数的区别
- 构造函数的补充
- 原型
- 原型图
- 获取原型对象的方法
- 原型对象的访问和设置
- 判断某个对象是否是指定实例对象的原型对象
- constructor
- isPrototypeOf
- instanceof
- 检测对象是公有还是私有
- 核心概念
- 继承
- 混入式继承
- 原型式继承
- 原型链继承
- 借用构造函数继承(call继承,经典继承)
- 组合式继承(推荐)
- class继承
- __ proto __属性
- call方法和apply方法
- Fuction相关知识
- 创建函数的方式
- eval函数
- 浅拷贝和深拷贝
- 浅拷贝
- 深拷贝
- Object相关知识
- Object原型属性和方法
- Object静态成员对象
- 案例
- 数组去重
- 闭包
- 语法
- DOM事件和闭包
- 定时器和闭包
- 即使对象初始化
- 闭包的变形
- 设计模式
- 单例模式
- 发布订阅模式(观察者模式)
- 工厂模式
- 命名空间模式
- 同步和异步
- 垃圾回收机制
- get和set
- JQuery
- 动画方法
- 事件
- 方法
- 节点
- 方法er
- HTML + CSS
- 经验
- flex布局
- px,em ,rem区别
- 清除浮动
- Less
- UI框架
- 一.Bootstrap框架
- 常用类名
- 二 .Animate.css
- 三.WOW.JS
- 四.scrollReveal.js
- 五.zepto框架
- zepto选择器
- 滑动事件
- tap触摸事件
- zepto动画
- 六,swipe框架
- 分页器
- 左右按钮和循环轮播
- 底部滚动和轮播方向
- 自动播放和切换效果
- 移入移除事件
- swipe结合animate.css
- 总结
- 滚滚屏
- 自动化构建工具
- 1.gulp
- 使用gulp编译less成css,并最终压缩css
- 压缩css
- 合并和压缩js
- 压缩图片
- 编写server服务
- 包管理器
- 介绍
- brew
- npm十全大补汤
- ES6
- class类
- class类的使用
- class类的继承结构
- let 和const
- 结构语法
- 模板字符串
- 化简写法
- 形参的默认值
- ...rest参数
- rest剩余参数
- 扩展参数
- 正则表达式
- 创建正则表达式的方式
- 构造函数
- 字面量的方式
- 其他(修饰符)
- 判断是否匹配成功
- 正则表达式案例
- 常见的匹配原则
- 验证密码长度
- 表单验证
- 正则提取
- 正则替换
- vue
- 插值操作
- Mustache语法
- 过滤器
- 绑定相关知识
- 绑定对象
- 单向绑定
- 双向绑定
- 绑定属性
- 动态绑定style
- 绑定事件
- 补充
- 绑定语法
- 基础
- vue介绍
- MVVM
- 计算属性
- 指令
- v-cloak
- 显示和隐藏
- 循环
- 自定义指令
- 本地缓存
- localStorage
- sessionStorage
- 对象劫持
- 组件
- 局部组件
- 父子组件
- 全局组件
- 组件访问实例数据
- 父传子
- 子传父
- 兄弟传兄弟
- 插槽
- methods,computed,watch的区别
- Vue.observable()
- vue.config.js配置
- 修饰符
- .sync修饰符
- $attrs和$listeners
- Node.js
- 使用Node执行js代码的两种方式
- 交互模式
- 解释js文件
- http模板
- request对象的使用
- express框架
- 安装
- post
- 获取请求参数
- post返回页面
- 重定向到别的接口
- get
- 返回页面
- get获取请求参数
- 请求静态资源
- 热重启
- Ajax
- 请求方式
- get请求
- post请求
- jQuery中的ajax方法
- JQuery中的get请求
- jQuery中的post请求
- 微信小程序
- 认识
- 引入样式的方式
- 绑定数据
- 小程序组件
- scroll - view 可滚动视图区域
- 发起请求
- template模板
- rich-text
- web-view
- open-data
- checkbox组件
- label组件
- radio组件
- picker组件
- swiper组件
- Git
- 跨域
- 左侧固定,右侧自适应
- vuex
- 如何解决vuex页面刷新数据丢失问题
- 数据结构
- 树
- 问题累积
- Axios
- 前端路由