JavaScript 之 事件(详解)

一、注册事件的三种方式

  1、直接事件方式

    语法格式

变量名.on事件名 =  function() {}

      注意:这种方式无法给同一对象的同一事件注册多个事件处理函数

  2、addEventListener 方式(IE9 以后才支持)

      语法格式

变量名.addEventListener(事件名,function(){})

      Demo :

1  // 浏览器兼容性问题  IE9以后才支持
2 btn.addEventListener(‘click‘, function () {
3      alert(‘hello world‘);
4 })
5
6 btn.addEventListener(‘click‘, function () {
7      alert(‘hello javascript‘);
8 })

  3、attachEvent 方式(IE老版本特有的方法 IE6-10坚持)

      语法格式:

变量名.attachEvent(on事件名,function(){})

      Demo :

1  // 第一个参数,事件的名称前要加 on
2 btn.attachEvent(‘onclick‘, function () {
3      alert(‘hello world‘);
4 });
5
6 btn.attachEvent(‘onclick‘, function () {
7      alert(‘hello javascript‘);
8 });

  由于以上的三种方式存在兼容问题,下面来封装一个函数来解决这个问题;

 1 // 处理注册事件的兼容性问题
 2 // element 事件源  eventName 事件名称   fn事件函数
 3     function addEventListener(element, eventName, fn) {
 4       // 判断当前浏览器是否支持addEventListener 方法
 5       if (element.addEventListener) {
 6         element.addEventListener(eventName, fn);  // 第三个参数 默认是false
 7       } else if (element.attachEvent) {
 8         element.attachEvent(‘on‘ + eventName, fn);
 9       } else {
10         // 相当于 element.onclick = fn;
11         element[‘on‘ + eventName] = fn;
12       }
13     }

二、移除事件的三种方式

  1、直接事件方式移除事件

      语法格式

变量名.on事件名 = null;

      Demo :

1 btn.onclick = function () {
2    alert(‘hello world);
3    // 移除事件
4    btn.onclick = null;
5 }

  2、addEventListener 移除事件

     使用这种方式移除事件的时候,不能像注册的时候使用匿名函数了,其中提供了 removeEventLister() 的方法

    语法格式

变量名.removeEventListener(事件名, function)

    Demo:

1 // 声明一个函数
2 function btnClick () {
3       alert(‘hello world‘);
4       // 移除事件
5       btn.removeEventListener(‘click‘, btnClick);
6 }
7 btn.addEventListener(‘click‘, btnClick);

  3、attachEvent 移除事件

    使用这种方式移除事件的时候,也不能使用匿名函数,使用 detachEvent() 来移除事件.

    语法格式

变量名.detachEvent(on事件名,function);

     Demo:

1  // chrome 中不支持attachEvent。 IE9-10
2 function btnClick() {
3      alert(‘hello world‘);
4      // 移除事件
5      btn.detachEvent(‘onclick‘, btnClick);
6 }
7 btn.attachEvent(‘onclick‘, btnClick);

  由于以上的三种方式存在兼容问题,下面来封装一个函数来解决移除事件的问题:

 1 // 处理移除事件的兼容性处理
 2 function removeEventListener(element, eventName, fn) {
 3   if (element.removeEventListener) {
 4     element.removeEventListener(eventName, fn);
 5   } else if (element.detachEvent) {
 6     element.detachEvent(‘on‘ + eventName, fn);
 7   } else {
 8     element[‘on‘ + eventName] = null;
 9   }
10 }
11
12 // 给 btn 注册和移除事件
13 function btnClick() {
14       alert(‘hello‘);
15       // 移除事件
16      removeEventListener(btn, ‘click‘, btnClick);
17 }
18 addEventListener(btn, ‘click‘, btnClick);

三、事件的三个阶段

  1、第一阶段:捕获阶段

  2、第二阶段:执行当前事件的元素

  3、第三阶段:冒泡阶段

    on事件名 只有事件冒泡阶段。

   addEventListener 的第三个参数为 false 的时候:事件冒泡;为 true 的时候:事件捕获。

   attachEvent 只有两个参数,只有事件冒泡。

   通过 事件对象.eventPhase 属性可以查看事件触发时所处的阶段

  4、事件冒泡的好处:事件委托 

    Demo:

 1 <ul id="ul">
 2     <li>西施</li>
 3     <li>貂蝉</li>
 4     <li>昭君</li>
 5     <li>凤姐</li>
 6     <li>芙蓉姐姐</li>
 7 </ul>
 8 <script>
 9     // 事件委托: 原理事件冒泡
10     var ul = document.getElementById(‘ul‘);
11     ul.onclick = function (e) {
12       // e 事件参数(事件对象): 当事件发生的时候,可以获取一些和事件相关的数据
13       // 获取到当前点击的li
14       // e.target 是真正触发事件的对象
15       // console.log(e.target);
16       // 让当前点击的li高亮显示
17       e.target.style.backgroundColor = ‘red‘;
18     }
19 </script>

   上面的代码中,当点击 li 的时候,让其高亮显示,可以给所在 ul 注册单击事件,这是因为 点击 li 的时候,会产生 事件冒泡,从而让 ul 也产生点击事件,在这个事件中通过事件对象 event 可以获取真正触发事件的对象 e.target。

四、事件对象

  1、事件对象

    事件对象,在存在事件函数里面的,并不是我们传递的参数,而是系统自带的一个对象。

    通过事件对象,可以获取事件发生的时候和事件相关的一些数据。

  2、获取事件对象

     语法格式:

变量名.onclick = function(e){
     // e 就是事件对象,event的缩写,DOM 标准中,是给事件处理函数一个参数,系统提供     // 在老版本的 IE 中获取事件对象的方式为 window.event
}

      处理事件的兼容性:

e = e || window.event;

  

  3、事件对象的属性和方法

       (1)e.eventPhase

      获取事件的阶段:1 捕获阶段     2 目标阶段    3 冒泡阶段

   (2)e.target

      获取真正触发事件的对象,存在浏览器兼容问题。

      在老版本的 IE 中, srcElement 是获取真正触发事件的对象

      兼容性处理:

var target = e.target || e.srcElement;

  

   (3)e.currentTarget

      事件处理函数所属的对象,相当于 this 关键字

   (4)e.type

      获取事件的类型,如 click、mouseover、mouseout 等事件

   (5)e.clientX / e.clientY

      e.elientX 获取鼠标在浏览器的可视区域横坐标

      e.clientY 获取鼠标在浏览器的可视区域纵坐标

   (6)e.pageX / e.pageY

      e.pageX 获取鼠标在当前页面横坐标;e.pageY 获取鼠标在当前页面纵坐标

      该属性存在浏览器兼容性问题, IE8 以前不支持

      处理兼容性代码:

 1 // 获取页面滚动距离的浏览器兼容性问题
 2 // 获取页面滚动出去的距离
 3 function getScroll() {
 4   var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
 5   var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
 6   return {
 7     scrollLeft: scrollLeft,
 8     scrollTop: scrollTop
 9   }
10 }
11
12 // 获取鼠标在页面的位置,处理浏览器兼容性
13 function getPage(e) {
14   var pageX = e.pageX || e.clientX + getScroll().scrollLeft;
15   var pageY = e.pageY || e.clientY + getScroll().scrollTop;
16   return {
17     pageX: pageX,
18     pageY: pageY
19   }
20 }

   (7)

   (8)

  4、

五、

六、

七、

八、

九、

原文地址:https://www.cnblogs.com/niujifei/p/11438071.html

时间: 2024-11-10 20:52:44

JavaScript 之 事件(详解)的相关文章

javascript之事件详解2

1.事件对象: 在触发DOM事件的时候都会产生一个对象. 2.事件对象event: (1).type:获取事件类型 (2).target:获取事件目标 (3).stopPropagation():阻止事件冒泡 (4).preventDefault():阻止事件默认行为 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 例(针对2-(1)): <div id="div"> <button id="btn1">按

javascript事件详解笔记

javascript事件详解笔记: 一.事件流 1.事件流: 描述的是页面中接受事件的顺序,有事件冒泡.事件捕获两种. 2.事件冒泡: 由最具体的元素接收,然后逐级向上传播到最不具体的元素的节点(文档). 3.事件捕获: 最不具体的节点先接收事件,而最具体的节点应该是最后接收事件. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>事件</title&

JavaScript事件详解-zepto的事件实现

zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们可以看到,整个event模块,事件绑定核心就是on和off,还有一个trigger用来触发,类观察者模式,可以先看看汤姆大叔的深入理解JavaScript系列(32):设计模式之观察者模式,其余皆为实现的处理函数.首先来个demo: $("#btn").on("click&quo

JavaScript 运行机制详解

JavaScript 运行机制详解——转载: 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM.这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另

使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 事件详解

在前文<使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 默认配置与事件基础>中,Kayo 对 jQuery Mobile 事件的基础作出了一些说明,建议在阅读本文前首先阅读前文,这里 Kayo 再引用前文的重要内容. “jQuery Mobile 在基于本地事件上,创建了一系列的自定义事件,大部分事件是基于触摸设备的使用情况开发的,当然这些事件对于桌面环境也会有适当的处理,开发者可以使用 bind() 函数绑定到需要的页面对象中. 值得

第三天:JS事件详解-事件流

学习来源: F:\新建文件夹 (2)\HTML5开发\HTML5开发\04.JavaScript基础\6.JavaScript事件详解 学习内容:  1)基础概念 2)举例说明: 代码如上,如果用事件冒泡的方式来解释,先点击到接受时间的按钮,然后是div,因为按钮包含在div中,然后是html5然后到文档 事件的捕获,首先是文档接收, 然后是html 然后是div 最后是最具体的元素button来接收 学后感: 只是记住了它的意思,但是并没有明白有什么实际意义

onunload、onbeforeunload事件详解--zhuan

最近项目中做到一个功能:在上传页面用户开始上传文件之后用户点击任意跳转都需要弹出提示层进行二次确定才允许他进行跳转,这样做的目的是为了防止用户的错误操作导致这珍贵的UGC 流失(通常用户在一次上传不成功之后,很容易就会打消了上传的念头的了,或去到其他平台进行上传). 在这里用到的是 onbeforeunload 事件.下面就梳理下 onunload.onbeforeunload 这两个事件,也顺带说说我遇到的问题与解决方案. onunload,onbeforeunload都是在刷新或关闭时调用,

[转]JavaScript异步机制详解

原文: https://www.jianshu.com/p/4ea4ee713ead --------------------------------------------------------------------------- 学习JavaScript的时候了解到JavaScript是单线程的,刚开始很疑惑,单线程怎么处理网络请求.文件读写等耗时操作呢?效率岂不是会很低?随着对这方面内容的了解和深入,知道了其中的奥秘.本篇文章就主要讲解一下JavaScript怎么处理异步问题. 一.同

JavaScript(2)---DOM详解

JavaScript(2)---DOM详解 一.DOM概念 什么是DOM DOM全称为文本对象模型(Document Object Model),它定义了所有HTML元素的对象和属性,以及访问他们的方法.它的主要作用包括: 改变HTML 元素 , 改变HTML属性 , 改变CSS 样式,对页面中的所有事件做出反应. 1.DOM 节点树 概念 DOM模型将整个HTML文档看成一个树形结构,并用document对象表示该文档,树的每个子节点表示HTM档中的不同内容. 如图 上图对应的html代码如下

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +