深入理解在JS中通过四种设置事件处理程序的方法


Posted in Javascript onMarch 02, 2017

所有的JavaScript事件处理程序的作用域是在其定义时的作用域而非调用时的作用域中执行,并且它们能存取那个作用域中的任何一个本地变量。但是HTML标签属性注册处理程序就是一个例外。看下面四种方式:

第一种方式(HTML标签属性):

<input type="button" id="btn1" value="测试" onclick="alert(this.id);" />

上面的代码是通过设置HTML标签属性为给button 添加了点击事件,当点击button 按钮时会弹出这个button的id,即btn1。

这种通过HTML属性来注册事件处理程序是一个例外。它们被转换为能存取全局变量的顶级函数而非任何本地变量。由于历史的原因,它们运行在一个修改后的作用域链中。通过HTML属性定义的事件处理程序能像本地变量一样使用目标对象、容器对象(form)对象和document对象的属性。它会被浏览器转换为类似如下的代码:

function (event){
  with(document){
   with(this.form||{}){
    with(this){
     /*具体的事件处理代码*/
    }
   }
  }  
}

关于with的用法,可以自行查阅,这里后面有文章讲解。读者先自行了解一下。提供一个连接(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/with)

这种方式现在已经不推荐使用。

第二种方式(调用函数)

<input type="button" id="btn2" value="测试" onclick="test()" />
<script type="text/javascript">
  function test(){
   alert(this.id);
  }
</script>

这段代码弹出来的是undefined。

这种设置方式是通过调用全局函数来进行的,这时this指向的是window,而非这个button的调用者,可以通过输出console.log(this==window);来进行验证

第三种方式(调用函数)

<input type="button" id="btn3" value="测试" />
<script type="text/javascript">
   var btn3 = document.getElementById("btn3");
        btn3.onclick = function () {
          alert(this.id);
        };
</script>

这段代码弹出来的是btn3。

这种事件处理程序在事件目标上定义,所以它们作为这个对象的方法来调用(但是下面在IE里面有个例外)。这就是说在事件处理程序内,this关键字指的是事件目标。

当使用addEventListener()注册时,调用的处理程序使用事件目标作为它们的this值。但是对于还用attachment()注册的处理程序作为函数调用,它们的this值是全局(window)对象。就是说的第四中方式

第四种方式(通过addEventListener和attachment):

<input type="button" id="btn3" value="测试" onclick="test()" />
 var btn = document.getElementById("btn3");
        var handler = function () { console.log(this.id); };
        if (btn.addEventListener) {
          console.log("addEventListener");
          btn.addEventListener("click", handler, false);
        }
        else if (btn.attachEvent) {//IE9之前的版本
          console.log("attachEvent");
          btn.attachEvent("onclick",handler);
        }

在IE5-IE8 版本输出的是undefined。(此时调用的是attachement)

IE9以后的版本输出的btn3.(修复了上面的问题,增加了通用的addEventListener)。

如果想修复IE5-8里面的那个问题,可以使用下面的方法。

/*
*target:目标对象,button之类的
*type:"click"字符串事件名称,无需带on
*handler:调用的处理程序
*/
function addEvent(target,type,handler){
 if (target.addEventListener) {
          target.addEventListener(type, handler, false);
        }
        else if (target.attachEvent) {//IE9之前的版本          
          btn.attachEvent("on"+type,function(event){
            return hanlder.call(target,event);//把处理程序作为事件目标的方法调用,更改this指向。
          });
        }
}

以上所述是小编给大家介绍的在JS中通过四种设置事件处理程序的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
遍历jquery对象的代码分享
Nov 02 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
Jun 21 Javascript
高效的获取当前元素是父元素的第几个子元素
Oct 15 Javascript
JavaScript获取DOM元素的11种方法总结
Apr 25 Javascript
全面解析Bootstrap排版使用方法(标题)
Nov 30 Javascript
详谈js中window.location.search的用法和作用
Feb 13 Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 jQuery
JavaScript显式数据类型转换详解
Mar 18 Javascript
ES6 Array常用扩展的应用实例分析
Jun 26 Javascript
layui form表单提交之后重新加载数据表格的方法
Sep 11 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
Sep 19 Javascript
在JavaScript中实现链式调用的实现
Dec 24 Javascript
JavaScript表单验证完美代码
Mar 02 #Javascript
js实现常见的工具条效果
Mar 02 #Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 #Javascript
jQuery给表格添加分页效果
Mar 02 #Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 #Javascript
Bootstrap Scrollspy源码学习
Mar 02 #Javascript
老生常谈jquery中detach()和remove()的区别
Mar 02 #Javascript
You might like
S900/ ETON E1-XM 收音机
2021/03/02 无线电
Codeigniter注册登录代码示例
2014/06/12 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
CI框架的安全性分析
2016/05/18 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
php unlink()函数使用教程
2018/07/12 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
Python中__name__的使用实例
2015/04/14 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
如何基于python实现归一化处理
2020/01/20 Python
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
Linux的文件类型
2012/03/07 面试题
师范生实习的个人自我鉴定
2013/10/20 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
小学生环保标语
2014/06/13 职场文书
宿舍标语大全
2014/06/19 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
资料员岗位职责范本
2015/04/13 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
2016年寒假生活小结
2015/10/10 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
python神经网络ResNet50模型
2022/05/06 Python