深入理解在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 相关文章推荐
13个绚丽的Jquery 界面设计网站推荐
Sep 28 Javascript
jQuery对象的selector属性用法实例
Dec 27 Javascript
基于 Node.js 实现前后端分离
Apr 23 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
May 25 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
Aug 29 Javascript
AngularJS的Filter的示例详解
Mar 07 Javascript
利用vscode调试编译后的js代码详解
May 14 Javascript
vue实现通讯录功能
Jul 14 Javascript
vue组件横向树实现代码
Aug 02 Javascript
详解JS取出两个数组中的不同或相同元素
Mar 20 Javascript
新手快速入门JavaScript装饰者模式与AOP
Jun 24 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
Dec 30 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
php图片验证码代码
2008/03/27 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
linux下安装easy_install的方法
2013/02/10 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
简单上手Python中装饰器的使用
2015/07/12 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
python flask实现分页效果
2017/06/27 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
python画图常规设置方式
2020/03/05 Python
Python yield的用法实例分析
2020/03/06 Python
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
资金主管岗位职责范本
2014/03/04 职场文书
环保倡议书格式范文
2014/05/14 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
出差报告怎么写
2014/11/06 职场文书
结婚保证书
2015/01/16 职场文书
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers