深入理解在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 相关文章推荐
在 IE 中调用 javascript 打开 Excel 表
Dec 21 Javascript
javascript 不间断的图片滚动并可点击
Jan 15 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
ajax处理php返回json数据的实例代码
Jan 24 Javascript
javascript定义变量时有var和没有var的区别探讨
Jul 21 Javascript
js中遍历Map对象的方法
Jul 27 Javascript
简单谈谈ES6的六个小特性
Nov 18 Javascript
Vue.js学习示例分享
Feb 05 Javascript
Vue.js实战之组件的进阶
Apr 04 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
详解vue中axios的封装
Jul 18 Javascript
解决vue scoped html样式无效的问题
Oct 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
JS运动特效之链式运动分析
2018/01/24 Javascript
使用python3.5仿微软记事本notepad
2016/06/15 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
python hashlib加密实现代码
2019/10/17 Python
python自动化实现登录获取图片验证码功能
2019/11/20 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
python eventlet绿化和patch原理
2020/11/21 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
护校行动方案
2014/05/31 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
停车场管理制度范本
2015/08/05 职场文书
学习计划是什么
2019/04/30 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python