深入理解在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中void(0)的具体含义解释
Feb 27 Javascript
JQuery的ajax基础上的超强GridView展示
Sep 18 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
May 04 Javascript
JavaScript访问CSS属性的几种方式介绍
Jul 21 Javascript
express的中间件cookieParser详解
Dec 04 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
jQuery布局组件EasyUI Layout使用方法详解
Feb 28 Javascript
vue component组件使用方法详解
Jul 14 Javascript
angularjs使用div模拟textarea文本框的方法
Oct 02 Javascript
Vue 中可以定义组件模版的几种方式
Aug 06 Javascript
vue router动态路由设置参数可选问题
Aug 21 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
Sep 19 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
MYSQL环境变量设置方法
2007/01/15 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
PHP7匿名类用法分析
2016/09/26 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
Python实现的计算器功能示例
2018/04/26 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
python实现合并两个排序的链表
2019/03/03 Python
python实现串口自动触发工作的示例
2019/07/02 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
环保倡议书怎么写
2014/05/16 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
Golang表示枚举类型的详细讲解
2021/09/04 Golang