深入理解在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 操作DOM案例代码分享
Apr 05 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
Feb 05 Javascript
选择器中含有空格在使用示例及注意事项
Jul 31 Javascript
Javascript函数式编程简单介绍
Oct 11 Javascript
Bootstrap图片轮播组件使用实例解析
Jun 30 Javascript
Vue表单验证插件Vue Validator使用方法详解
Apr 07 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
Jul 17 Javascript
实例分析js事件循环机制
Dec 13 Javascript
利用JS实现一个同Excel表现的智能填充算法
Aug 13 Javascript
自定义Vue中的v-module双向绑定的实现
Apr 17 Javascript
vue项目中实现缓存的最佳方案详解
Jul 11 Javascript
js实现上下左右键盘控制div移动
Jan 16 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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
php 数学运算验证码实现代码
2009/10/11 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
实体的生命周期
2013/08/31 面试题
环境工程毕业生自荐信
2013/11/17 职场文书
道德演讲稿
2014/05/21 职场文书
法人身份证明书
2014/10/08 职场文书
幼儿园教师安全责任书
2015/05/08 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
防止web项目中的SQL注入
2021/12/06 MySQL