JS学习笔记6_事件
1.事件冒泡
由内而外的事件传播(从屏幕里飞出来一支箭的感觉)
2.事件捕获
由表及里的事件传播(力透纸背的感觉)
3.DOM事件流(DOM2级)
事件捕获阶段 -> 处于目标阶段 -> 事件冒泡阶段(拿根针从屏幕扎进去,缝衣服的感觉)
事件捕获是从DOM树根到叶子的事件传播,所以可以在靠近根的位置捕获(event.stopPropagation)事件,让叶子收不到事件信号
事件冒泡是从叶子到根的原路返回过程,所以可以在靠近根的位置集中处理(event.target)叶子的事件,也就是所谓的事件委托,集中处理可以避免给多个叶子绑定事件处理器,拉低响应速度
处于目标阶段只是规范要求,浏览器没怎么支持
注意:[IE9+]支持事件捕获,事件冒泡是全浏览器支持的
4.添加事件处理器的几种方式
HTML:on事件名 = strCode事件处理函数可直接访问的属性 = 全局属性 + 元素所在form中的属性 + 元素本身的属性
自动的作用域扩展方式相当于:
function(){
with(document){//全局属性
with(this.form){//表单属性
with(this){
//本身属性
}
}
}
}事件处理函数可以直接访问这么多属性,所以,可以这样做:
<form method="post">
<input type="text" name="user_name" value="">
<input type="button" value="获取用户名" onclick="alert(user_name.value)">
</form>DOM0级:elem.on事件名 = functionName/null;
以这种方式添加的事件处理器在冒泡阶段执行,可直接访问的属性 = 全局属性 + 元素本身的属性
DOM2级:(现代浏览器支持的)elem.add/removeEventListener(事件名, functionName, false/true);
false表示在事件冒泡阶段添加,true表示在事件捕获阶段添加。可直接访问的属性同上
[IE8-]:elem.attach/detachEvent(on事件名(on不能丢了), functionName);
可直接访问的属性只有全局属性,而且对同一事件添加的多个处理器中,最后添加的最先执行,与DOM2级标准相反
P.S.[IE8-]只支持事件冒泡,所以没有第三个参数,默认(也只能是)在事件冒泡阶段添加
5.事件对象有什么用?
btn.onclick = function(event){
//event.target;获取事件源
//event.preventDefault();取消默认行为,比如链接的跳转行为
//event.stopPropagation();阻断事件传播
//还有一些不常用的
}
注意:上面代码并不是全浏览器兼容的,事件对象的属性也不完整,更多信息请查看JS原生事件处理(跨浏览器)
6.事件分类
UI事件
焦点事件
鼠标事件
滚轮事件
文本事件
键盘事件
合成事件(用IME输入)
变动事件(DOM结构更新)
HTML5事件
设备事件(特定设备,比如游戏机)
触摸与手势事件
7.事件委托
利用事件冒泡来减少事件处理器,以提升性能。甚至可以给document对象添加事件处理器,以求更短的交互准备时间(页面元素与事件处理器建立连接需要时间)
事件委托的优点:
设置事件处理器需要时间更少,因为DOM访问次数变少了
占用内存空间更少,因为事件处理器变少了
交互准备时间变短了,因为页面元素与事件处理器之间需要建立的连接变少了
页面响应速度变快了,因为页面元素与事件处理器之间建立的连接变少了
8.移除事件处理器的注意事项
在目标元素被从DOM树中删除前应该手动移除与之绑定的事件处理器,避免失效的事件处理器占用内存
在页面unload之前,最好手动移除页面中的所有事件处理器,因为[IE8-]在unload页面时,事件处理器会滞留在内存中。可以在unload事件处理器中移除
移除事件处理器的实质是断开页面元素与事件处理器之间的连接
9.模拟事件的方式(即代码触发指定事件)
创建event对象
初始化event对象的各项属性
触发事件
注意:[IE8-]的实现与DOM规范不同;DOM3级才能完美模拟键盘事件
10.常识及性能优化策略
只有在需要拦截别的事件时才把事件处理器添加在捕获阶段,因为[IE8-]不支持事件捕获
对于动态创建的img元素,只要设置了src属性就会开始下载相关内容,而不是在新元素被插入DOM树后才开始
对于动态创建的script元素,只有插入DOM树后才会开始下载
对于动态创建的link元素(用来加载外部样式),只有插入到head部分才能保证浏览器表现一致,而且外部样式默认是异步加载的
用in操作符来检测事件支持,例如:
if('onload' in elem){
//do sth
}hover, mouseover, mouseout, mouseenter, mouseleave的区别是什么?
- hover是CSS伪类,鼠标进入并处于目标元素中时触发;
- mouseover是鼠标事件,鼠标进入目标元素时触发,得到了浏览器广泛支持。相当于mouseenter,但nouseenter没有得到完全支持;
- mouseout与mouseover相反,mouseleave与mouseenter相反,后者没有得到完全支持;
- 本机测试:FF和IE全支持,Chrome不支持enter/leave。
事件委托是最重要的优化策略,当然,委托也不是完美的,委托会导致逻辑粘连,比如极端的情况,给document对象添加一个事件处理器就够了,但那将是一个很大只的函数。。。所以,应该在合适的地方尽量用委托
适时移除过期的时间处理器可以减少内存占用,这是空间方面的优化策略
JS学习笔记6_事件的更多相关文章
- [JS学习笔记]Javascript事件阶段:捕获、目标、冒泡
当你在浏览器上点击一个按钮时,点击的事件不仅仅发生在按钮上,同时点击的还有这个按钮的容器元素,甚至也点击了整个页面. 事件流 事件流描述了从页面接收事件的顺序,但在浏览器发展到第四代时,浏览器开发团队 ...
- JS学习笔记5_DOM
1.DOM节点的常用属性(所有节点都支持) nodeType:元素1,属性2,文本3 nodeName:元素标签名的大写形式 nodeValue:元素节点为null,文本节点为文本内容,属性节点为属性 ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- 基于jquery的插件turn.js学习笔记
基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...
- 【转】Backbone.js学习笔记(二)细说MVC
文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- Node.js学习笔记(2):基本模块
Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
随机推荐
- servlet 高级知识之Listener
Listener,顾名思义,监听器.它可以监听客户端的请求.服务端的操作等. 通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionCre ...
- Java设计模式(8)——策略模式
一.策略模式定义 Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户 ...
- java:static详解
1.static修饰的变量习惯称为静态变量,static修饰的方法称为静态方法,static修饰的代码块叫做静态代码块. 1)static变量 static变量也称作静态变量,静态变量和非静态变量的区 ...
- Jvm(jdk8)源码分析1-java命令启动流程详解
JDK8加载源码分析 1.概述 现在大多数互联网公司都是使用java技术体系搭建自己的系统,所以对java开发工程师以及java系统架构师的需求非常的多,虽然普遍的要求都是需要熟悉各种java开发框架 ...
- 45.UITableView去除分割线
1.去除所有的分割线 table.separatorStyle = UITableViewCellSelectionStyleNone; 2.去除指定某一行的分割线 cell.separatorIns ...
- 纯css实现蒙层loading效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 用cglib包来为类产生动态代理类对象
一:在JDK里也有动态代理的类和接口,是Proxy和InvocationHandler,但是Proxy只能为接口产生代理类,借助InvocationHandler的实现类来完成对类对象的代理: 但是在 ...
- java术语(PO/POJO/VO/BO/DAO/DTO)
PO(persistant object) 持久对象在o/r 映射的时候出现的概念,如果没有o/r映射,就没有这个概念存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库 ...
- 同时安装python2.7和python3.5
同时安装python2.7和python3.5,并配置sublime ctrl+B选择运行python版本 安装python 首先是安装两个版本的python,并配置相应的环境变量 1.在下载安装好P ...
- Sprinig泛型依赖注入
在父类中建立关系 (spring4.x以上版本) package com.spring.annotation.generic; import org.springframework.beans.fac ...