一、注册事件的三种方式

  1、直接事件方式

    语法格式

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

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

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

      语法格式

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

      Demo :

  // 浏览器兼容性问题  IE9以后才支持
btn.addEventListener('click', function () {
alert('hello world');
}) btn.addEventListener('click', function () {
alert('hello javascript');
})

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

      语法格式:

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

      Demo :

  // 第一个参数,事件的名称前要加 on
btn.attachEvent('onclick', function () {
alert('hello world');
}); btn.attachEvent('onclick', function () {
alert('hello javascript');
});

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

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

二、移除事件的三种方式

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

      语法格式

变量名.on事件名 = null;

      Demo :

 btn.onclick = function () {
alert('hello world);
// 移除事件
btn.onclick = null;
}

  2、addEventListener 移除事件

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

    语法格式

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

    Demo:

 // 声明一个函数
function btnClick () {
alert('hello world');
// 移除事件
btn.removeEventListener('click', btnClick);
}
btn.addEventListener('click', btnClick);

  3、attachEvent 移除事件

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

    语法格式

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

     Demo:

  // chrome 中不支持attachEvent。 IE9-10
function btnClick() {
alert('hello world');
// 移除事件
btn.detachEvent('onclick', btnClick);
}
btn.attachEvent('onclick', btnClick);

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

 // 处理移除事件的兼容性处理
function removeEventListener(element, eventName, fn) {
if (element.removeEventListener) {
element.removeEventListener(eventName, fn);
} else if (element.detachEvent) {
element.detachEvent('on' + eventName, fn);
} else {
element['on' + eventName] = null;
}
} // 给 btn 注册和移除事件
function btnClick() {
alert('hello');
// 移除事件
removeEventListener(btn, 'click', btnClick);
}
addEventListener(btn, 'click', btnClick);

三、事件的三个阶段

  1、第一阶段:捕获阶段

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

  3、第三阶段:冒泡阶段

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

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

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

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

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

    Demo:

 <ul id="ul">
<li>西施</li>
<li>貂蝉</li>
<li>昭君</li>
<li>凤姐</li>
<li>芙蓉姐姐</li>
</ul>
<script>
// 事件委托: 原理事件冒泡
var ul = document.getElementById('ul');
ul.onclick = function (e) {
// e 事件参数(事件对象): 当事件发生的时候,可以获取一些和事件相关的数据
// 获取到当前点击的li
// e.target 是真正触发事件的对象
// console.log(e.target);
// 让当前点击的li高亮显示
e.target.style.backgroundColor = 'red';
}
</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 以前不支持

      处理兼容性代码:

 // 获取页面滚动距离的浏览器兼容性问题
// 获取页面滚动出去的距离
function getScroll() {
var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
return {
scrollLeft: scrollLeft,
scrollTop: scrollTop
}
} // 获取鼠标在页面的位置,处理浏览器兼容性
function getPage(e) {
var pageX = e.pageX || e.clientX + getScroll().scrollLeft;
var pageY = e.pageY || e.clientY + getScroll().scrollTop;
return {
pageX: pageX,
pageY: pageY
}
}

   (7)扩展

    offsetLeft / offsetTop ,获取当前元素在可视区域内的距离左边和上面的距离

    Demo:

 <div id="box">  </div>
<script>
var box = document.getElementById('box');
box.onclick = function() {
console.log(this.offsetLeft); // 获取盒子距离左边的距离
console.log(this.offsetTop); // 获取盒子距离上边的距离
}
</script>

  4、取消默认行为

   (1) 在函数中  return false     就可以取消默认行为的执行

   (2)e.preventDefault()            DOM中取消默认行为的标准方法

   (3)e.preventValue = false;    IE 的老版本,非标准方式

  5、取消冒泡

   (1)e.stopPropagation()         DOM 中停止事件传播的标准方法

   (2)e.cancleBubble = true      非标准的方式,老版本的 IE 支持,标准中已经废弃

  6、常见的事件

   (1)鼠标事件

      • click:单击事件,元素被点击是触发该事件
      • change:内容改变事件,当 input、select、textare 等元素内容发生改变时,触发该事件
      • focus:当元素获取焦点时触发该事件
      • blur: 当元素失去焦点时触发该事件
      • onload:当打开页面时,就会执行该事件,实际开发过程中,常常使用该事件在页面打开时初始化JS。
      • mouseover:鼠标移入触发该事件
      • mouseout:鼠标移出触发该事件
      • mousemove:鼠标在该元素上面移动时触发该事件
      • mouseup:鼠标按键放开时触发
      • mousedown:鼠标按键按下触发
      •  mouseenter:鼠标移入触发该事件
      •    mouseleave:鼠标移出触发该事件

     注意mouseenter / mouseleave  不会触发事件冒泡;mouseover / mouseout     会触发事件冒泡

   (2)键盘事件

      •    keydown:键盘按下的时候,这时候所按的键还没有落入文本框

      • keyup:键盘弹起的时候,这时候按的键已经落入文本框了

      扩展:可以根据 e.keyCode 来获取键的 ASCII 码。

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

  1. javascript冒泡事件详解

    冒泡事件: 定义:当多个Dom元素互相嵌套的时候,一个元素触发了某个事件(例如Click事件),那么嵌套此事件的所有元素都会被触发一次Click事件,注意:只会触发他的直系亲属元素,而与其自己,父级, ...

  2. javascript之事件详解2

    1.事件对象: 在触发DOM事件的时候都会产生一个对象. 2.事件对象event: (1).type:获取事件类型 (2).target:获取事件目标 (3).stopPropagation():阻止 ...

  3. javaScript -- touch事件详解(touchstart、touchmove和touchend)

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...

  4. JavaScript——event事件详解

    1.事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什么时候会产生Event 对象呢? 例如: 当用户单击某个元素的时候,我们给这个元 ...

  5. JavaScript事件详解-jQuery的事件实现(三)

    正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...

  6. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

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

    zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们 ...

  8. JAVASCRIPT事件详解-------原生事件基础....

    javaScirpt事件详解-原生事件基础(一)   事件 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,通过监听特定事件的发生,你能 ...

  9. JavaScript中的鼠标滚轮事件详解

    JavaScript中的鼠标滚轮事件详解/*Firefox注册事件*/ ~~~Firefox: addEventListener('DOMMouseScroll', handler, false)if ...

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

    学习来源: F:\新建文件夹 (2)\HTML5开发\HTML5开发\04.JavaScript基础\6.JavaScript事件详解 学习内容:  1)基础概念 2)举例说明: 代码如上,如果用事件 ...

随机推荐

  1. 07-numpy-笔记-join

    字符串.join(字符串序列) 一目了然: #!/usr/bin/python # -*- coding: UTF-8 -*- str = "-"; seq = ("a& ...

  2. Leecode之双指针及二分查找

    题目 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的 ...

  3. 【java异常】【redis】ERR Client sent AUTH, but no password is set

    项目中使用jedis或redisson连接redis时,如果redis没有密码,但在配置文件中写为 spring: redis: database: 0 host: 127.0.0.1 passwor ...

  4. 如何关闭/禁用.NET JIT调试对话框

    当.NET程序有未处理的异常时,您可能会希望关闭出现的调试对话框.下面有两个选项: 1.启用JIT调试的注册表项 对于包含托管代码的应用程序,公共语言运行库将显示类似于JIT附加调试器的对话框.控制此 ...

  5. ajax有哪些方法可以实现跨域?他们都有哪些局限性?

    1.服务器端代理:在服务器端设置一个代理,由服务器端向跨域下的网站发出请求,再将请求结果返回给前端. 属于后端的技术,实现起来最麻烦. 2.jsonP,只支持get方式调用. 3.XHR2(cors) ...

  6. 虚拟化原理到K8s实践经验路线总结

    以下这些内容均为自行学习总结的内容,很多内容没有写概括介绍,看起来可能会有些突兀,但并不影响整体性,我自己的学习经验告诉我,这些内容还仅仅是最精简的核心部分,周边还有很多可扩展内容,主要是操作系统生态 ...

  7. GitHub 上传文件过大报错:remote: error: GH001: Large files detected.

    1.查看哪个文件过大了 报错信息: remote: Resolving deltas: 100% (24/24), completed with 3 local objects. remote: wa ...

  8. mac Sublime Text 快捷键

    mac Sublime Text 快捷键 Tab: 光标后缩进 Shift+Tab: 反缩进 cmd+P: 打开文件切换面板 cmd+/: 行注释 cmd+R: 快速列出/跳转到某个函数 双击可选中光 ...

  9. asp.net core api 跨域配置

    项目前后端分离,前端请求接口例如使用axios发送请求时浏览器会提示跨域错误,需要后端配置允许接口跨域 配置步骤: 1.通过NuGet安装Microsoft.AspNetCore.Cors.dll类库 ...

  10. Mercari Price Suggestion in Kaggle

    Mercari Price Suggestion 最近看到了一个竞赛,竞赛的内容是根据已知的商品的描述,品牌,品类,物品的状态等特征来预测商品的价格 最后的评估标准为 平均算术平方根误差Root Me ...