JS事件流与事件处理程序实例分析


Posted in Javascript onAugust 16, 2019

本文实例讲述了JS事件流与事件处理程序。分享给大家供大家参考,具体如下:

1.事件流:从页面中接收事件的顺序

1.1 IE :事件冒泡流
1.2 Netscape :事件捕获
1.3 DOM事件流 :事件捕获阶段——事件目标阶段——事件冒泡阶段
DOM2级事件规定 :捕获阶段不会涉及目标事件。

2.事件处理程序

事件 :用户或者浏览器自身执行的 某种动作
事件处理程序 :响应某个事件的 函数 。

2.1 HTML事件处理程序

用一个与该事件处理程序同名的HTML特性来指定。

2.1.1包含要执行的具体动作

<input type="button" value="Click me" onclick="alert('Clicked')"/>

2.1.2 调用其他地方定义的脚本

<input type="button" value="Click me" onclick="showMessage()"/>

2.1.3 缺点

  • 1.时差问题:使用try-catch块捕捉错误。onclick="try { showMessage() ;} catch(ex) {} "
  • 2.程序的作用域链在不同浏览器中会导致不同结果
  • 3.HTML和JS代码耦合紧密

2.2 DOM0级事件处理程序

将一个函数赋值给一个事件处理程序属性,例如:onclick。

为事件处理程序赋值。

btn.onclick = function() {
  alert( this.id );
};

事件处理程序在元素的作用域中运行,this指向当前元素。

删除事件处理程序:

btn.onclick = null;

2.3 DOM2级事件处理程序

addEventListener(处理的事件名,事件处理程序函数,布尔值);

removeEventListener(处理的事件名,事件处理程序函数,布尔值);

布尔值:捕获阶段调用事件处理程序:true。冒泡阶段调用:false。大多数情况下用false。

btn.addEventListener("click" , function() {
  alert(this.id);
}, false);

好处:可以添加多个事件处理程序。事件按照添加先后顺序执行。

问题:匿名函数无法移除。

最好写成

var handler = function(){
  alert(this.id);
};
btn.addEventListener("click", handler, false);
btn.removeEventListener("click", handler, false);

2.4 IE事件处理程序

attachEvent(事件处理程序名称,事件处理程序函数);
detachEvent(事件处理程序名称,事件处理程序函数);

通过该方法添加的事件处理程序,都会被添加到冒泡阶段。

btn.attachEvent("onclick",function(){
  alert("clicked");
});

注意:使用DOM级方法时,事件会在所属元素的作用域内运行;使用attachEvent()方法,事件处理程序会在全局作用域运行,this==window。

好处:可以添加多个事件处理程序。后添加先执行。

问题:匿名函数无法移除。

var handler = function(){
  alert(this.id);
};
btn.attachEvent ("onclick", handler);
btn.detachEvent ("onclick", handler);

2.5跨浏览器事件处理程序

  • 1.创建一个方法addHandler():区分使用哪种方法来添加事件;
  • 2.创建一个对象EventUtil。拥有两个方法。
  • 3.addHandler(要操作的元素,事件名称,事件处理函数)。
  • 4.removeHandler(要操作的元素,事件名称,事件处理函数)。
var EventUtil = {
  addHandler: function(element,type,handler){
    if(element.addEventLister) {
      element.addEventListener(type,handler,false);
    } else if(element.attachEvent) {
      element.attachEvent("on"+type, handler);
    }else {
      element.["on"+type] =handler;
    }
  },
  removeHandler: function(element,type,handler){
    if(element.addEventLister) {
      element.removeEventListener(type,handler,false);
    } else if(element.attachEvent) {
      element.detachEvent("on"+type, handler);
    }else {
      element.["on"+type] = null;
    }
  }
};

使用:

EventUtil.addHandler(btn ,"click",handler);
EventUtil.removeHandler(btn ,"click",handler);

PS:这里再为大家附上javascript系统自带事件参考表供大家参考查询:

javascript事件与功能说明大全:
http://tools.3water.com/table/javascript_event

更多关于JavaScript相关内容可查看本站专题:《JavaScript事件相关操作与技巧大全》、《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript IFrame 强制刷新代码
Jul 23 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
May 28 Javascript
jQuery+css实现炫目的动态块漂移效果
Jan 28 Javascript
javascript基本语法
May 31 Javascript
jquery树形菜单效果的简单实例
Jun 06 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
JS封装的选项卡TAB切换效果示例
Sep 20 Javascript
node.js入门教程之querystring模块的使用方法
Feb 27 Javascript
layer.prompt输入层的例子
Sep 24 Javascript
webpack 处理CSS资源的实现
Sep 27 Javascript
vue 实现v-for循环回来的数据动态绑定id
Nov 07 Javascript
nuxt引入组件和公共样式的操作
Nov 05 Javascript
javascript事件监听与事件委托实例详解
Aug 16 #Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
Aug 16 #Javascript
详解Vue中组件传值的多重实现方式
Aug 16 #Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
Aug 16 #Javascript
JavaScript JSON数据处理全集(小结)
Aug 15 #Javascript
JointJS JavaScript流程图绘制框架解析
Aug 15 #Javascript
基于vue写一个全局Message组件的实现
Aug 15 #Javascript
You might like
php设计模式 Template (模板模式)
2011/06/26 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
js实现简单页面全屏
2019/09/17 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python迭代dict的key和value的方法
2018/07/06 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
Python换行与不换行的输出实例
2020/02/19 Python
如何用Python 加密文件
2020/09/10 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
甜品蛋糕店创业计划书
2014/09/21 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
思想品德评语大全
2014/12/31 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
道歉短信大全
2015/05/12 职场文书
2016年情人节问候语
2015/11/11 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
python缺失值填充方法示例代码
2022/12/24 Python