1、设置js对象属性为事件处理程序

事件处理程序属性的名字由“on”后面跟着事件名组成。这些属性名 都必须小写

事件处理程序的缺点:设计都是围绕着假设每个事件目标对于每种事件类型将最多只有一个处理程序。

2、设置html标签属性为事件处理程序

属性值为javascript代码字符串。这段代码应该是事件处理程序函数的主体,而非完整的声明。

缺点:

客户端编程的通用风格是保持html内容和javascript行为分离,遵循这条规则的程序员禁止/避免使用html事件处理程序属性,因为这些属性直接混合了javascript和html

通过html属性注册事件处理函数时,浏览器会把javascript编码转换到一个函数中。非ie浏览器使用event参数来构造函数,而ie在构造函数时没有要求参数。

3.1、addEventListener

特点:能多次调用addEventListener为同一个对象注册同一事件类型的多个处理函数。

当对象发生事件时,所有该事件类型的注册处理程序都会按照注册的顺序调用。

3.2、attachEvent

ie9之前的版本支持

ie不支持事件捕获,所以attachEvent和detachEvent只有2个参数:事件类型和处理函数

ie下第一个参数使用了带“on”前缀的事件处理程序属性名,而非没有前缀的事件类型。

attachEvent允许相同的事件处理程序函数注册多次,当特定的事件类型发送时,注册函数的调用次数和注册次数一样。

4、事件处理程序的运行环境

在事件处理程序内,this关键字指的是事件目标。

甚至当使用addEventListener注册时,调用处理程序使用事件目标作为它们的this值。但是,对于attachEvent来讲这是不对的:使用attachEvent注册的处理程序作为函数调用,他们的this值是全局(window)对象。

解决:

  1. function addEvent(target, type, handler) {
  2. if (target.addEventListener) {
  3. target.addEventListener(type, handler);
  4. } else {
  5. target.attachEvent("on" + type, function (event) {
  6. return handler.call(target, event);
  7. })
  8. }
  9. }

//使用此方法时处理程序不能删除。

5、事件处理程序的作用域

事件处理函数从词法上讲也是作用域。它们在其定义时的作用域而非调用时的作用域中执行,并且能读取那个作用域中的任何一个本地变量。

html属性注册事件处理函数程序被转换为能存取全局变量的顶级函数而非任何本地变量。但是因为历史原因,它们运行在一个修改后的作用域链中。通过html属性定义的事件处理函数能好像本地变量一样使用目标对象、容器对象、Document对象的属性。

html属性最不自然的地方包括冗长的代码串和修改后的作用域链允许有用的快捷方式。

另一方面html事件处理程序中修改的作用域链是陷阱之源,因为作用域链中每个对象的属性在全局对象中都有相同名字的属性。

  1. <button onclick="open()">按钮</button>
  2. <!--点击button后alert没有弹出-->
  3. <script type="text/javascript">
  4. function open() {
  5. alert(1)
  6. }
  7. window.open();
  8.  
  9. <button id="ck" >按钮</button>
  10. <script type="text/javascript">
  11. function open() {
  12. alert(1)
  13. }
  14. document.getElementById('ck').onclick = open;//alert出来1

6、事件处理程序的返回值

事件处理程序的返回值只对通过属性注册的出来程序才有意义。

7、调用顺序

通过设置对象属性或html属性注册的处理程序一直优先调用

使用addEventListener注册的处理程序按照他们的优先顺序调用

使用attachEvent注册的处理程序可能按照任何顺序调用,所以代码不应该依赖于调用顺序

8、事件传播

事件冒泡为在大量单独文档元素上注册处理程序提供了替代方案,即在共同的祖先元素上注册一个处理程序来处理所有的事件。

发生在文档元素上的大部分事件都会冒泡,值得注意的例外是focus、blur、scroll事件。

文档元素上的load事件,只会冒泡到 document对象上,不会传播到window对象。

JS 事件介绍的更多相关文章

  1. Node.js 事件循环(Event Loop)介绍

    Node.js 事件循环(Event Loop)介绍 JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”.Node.js在JavaScript的基 ...

  2. js 事件冒泡是什么如何用jquery阻止事件冒泡

    什么是事件起泡:一个事件不能凭空产生,这就是事件的发生等等,接下来为大家介绍下jquery阻止事件起泡以及关于js事件起泡的验证,感兴趣的朋友可以参考下哈       (1)什么是事件起泡 首先你要明 ...

  3. js事件监听器用法实例详解

    这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分 ...

  4. Web3D编程入门总结——WebGL与Three.js基础介绍

    /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...

  5. Node.js 事件

    Node.js 事件 Node.js 所有的异步I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, ...

  6. 【js】IE、FF、Chrome浏览器中的JS差异介绍

    如何判断浏览器类型 转:http://www.cnblogs.com/carekee/articles/1854674.html 1.通过浏览器特有的对象 如ie 的ActiveXObject  ff ...

  7. JS事件调试

    JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置   日常的网页开发调试工作中,经常需要知道指定的某个网页元素绑定了哪些事件以及绑定代码的位置,下面介绍三种用来跟踪页面中的事件的方法. ...

  8. JS中的函数、Bom、DOM及JS事件

    本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...

  9. node.js零基础详细教程(4):node.js事件机制、node异步IO操作

    第四章 建议学习时间3小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

随机推荐

  1. 定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, 随机的10个字母和数字的组合;字母和数字的范围可以指定,类似(1~100)(A~z)

    #习题2:定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, #随机的10个字母和数字的组合:字母和数字的范围可以指定 class RandomString(): #随机数选择的范围作为 ...

  2. python 学习笔记_1 pip安装、卸载、更新包相关操作及数据类型学习

    '''prepare_1 pip安装.卸载.更新组件type 各数据类型''' py -3 -m pip py -3 -m pip listpy -3 -m pip show nosepy -3 -m ...

  3. 大数据之路week02 Collection 集合体系收尾(Set)

    1.Set集合(理解) (1)Set集合的特点 无序,唯一. (2)HashSet集合(掌握) A: 底层数据结构是哈希表(是一个元素为链表的数组) B: 哈希表底层依赖两个方法: hashCode( ...

  4. [flask初学问题]RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/

    看B站视频学习flask-SQLalchemy时,报错RuntimeError: No application found. Either work inside a view function or ...

  5. 第六章 Flask数据库(二)

    Flask-SQLALchemy Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展. 它需要 SQLAlchemy 0.6 或更高的版本.它致力于 ...

  6. 设置了msconfig处理器个数和内存开不了机终极解决办法

    1.进入 启动修复 的 命令提示符(最好是使用有管理员权限的,不过普通用户我也每试过), 使用 bcdedit 命令来查看. 2.可以查看到你的启动参数. 确认 truncatememory 是否为 ...

  7. HDU-3341-Lost's revenge(AC自动机, DP, 压缩)

    链接: https://vjudge.net/problem/HDU-3341 题意: Lost and AekdyCoin are friends. They always play "n ...

  8. 020_C语言常用函数

    1. 清除数组,初始化数值 头文件:#include <memory.h>或 #include <string.h>函数原型:memset(void *s,int ch,siz ...

  9. 001_89C52之_Proteus_ADC0809采集电压

    一)使用ADC0809采集直流电压 1. 第一个数码管显示的是采样输入口 2. 后面三位是采样电压 (二)使用ADC0809进行交流电的采样 1. 先进行交流电降压,即用变压器降压后使用整桥电路进行整 ...

  10. 005_STM32程序移植之_RC522读卡模块

    1. 测试环境:STM32C8T6 2. 测试模块:RC522读卡模块 3. 测试接口: RC522读卡模块: VCC------------------3.3V GND--------------- ...