深入理解在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 相关文章推荐
javascript 支持链式调用的异步调用框架Async.Operation
Aug 04 Javascript
jquery 查找新建元素代码
Jul 06 Javascript
基于jquery的滚动鼠标放大缩小图片效果
Oct 27 Javascript
iframe窗口高度自适应的实现方法
Jan 08 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
Aug 11 Javascript
常见的jQuery选择器汇总
Nov 24 Javascript
禁止按回车键提交表单的方法
Jun 11 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
Apr 17 Javascript
关于Vue.nextTick()的正确使用方法浅析
Aug 25 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
Jan 19 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 Javascript
Vue快速实现通用表单验证的示例代码
Jan 09 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源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
php数组去重的函数代码
2013/02/03 PHP
解析php中反射的应用
2013/06/18 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
python实现聚类算法原理
2018/02/12 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
高考标语大全
2014/06/05 职场文书
大学生安全责任书
2014/07/25 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
2015暑假假期总结
2015/07/13 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
利用Java连接Hadoop进行编程
2022/06/28 Java/Android