JavaScript(1)---绑定事件、解除绑定事件

一、事件概述

1、事件的几个概念

· 事件

指的是文档或者浏览器窗口中发生的一些特定交互瞬间。我们可以通过侦听器(或者处理程序)来预定事件,以便触发事件的时候执行相应的代码。

事件处理程序

我们用户在页面中进行的点击动作(click)、鼠标移动动作(mousemove)等,都可以称之为事件名称。响应某个事件的函数则称为事件处理程序,或者叫做事件侦听器。

事件类型

UI事件: load、unload、error、resize、scroll、select,是用户与页面上的元素交互时触发的。

焦点事件:blur、DOMFocusIn、DOMFocusOut、focus、focusin、focusout,在元素获得或失去焦点的时候触发,这些事件当中,最为重要的是blur和focus,

有一点需要引起注意,这一类事件不会发生冒泡

鼠标与滚轮事件:click、dblclick、mousedown、mouseenter、mouseleave、mousemove、mouseout、mouseover、mouseup,是当用户通过鼠标在页面执行

操作时所触发的。

滚轮事件:mousewheel(IE6+均支持)、DOMMouseScroll(FF支持的,与mousewheel效果一样)。是使用鼠标滚轮时触发的。

文本事件:textInput,在文档中输入文本触发。

键盘事件:keydown、keyup、keypress,当用户通过键盘在页面中执行操作时触发。

2、事件三要素

事件有三要素 : 事件源事件监听器

事件源:在哪个元素上发生的。比如: p标签、a标签、div标签、form表单 等等

事件:到底发生了什么事件。click(点击事件)、mouseover(鼠标事件)、focus(焦点事件) 等

监听器:事件源触发事件后,如何回应发生的事件,通常以函数(funtion)的形式来出现。

注意 事件不是以 on 开头的那个名称,如 onclick 不是事件,click才是事件。onclick引用的是一个元素对象的属性,它指向click事件类型绑定的实际处理函数。

二、绑定事件、解绑事件

常用的事件绑定的几种方式有三种:

  1. 1、直接在html元素上进行绑定事件。
  2. 2、用 on 绑定事件。
  3. 3、用 addEventListenerattachEvent 绑定事件。

1、直接在 html 元素上进行绑定

即以属性的方式直接写在行内

  1. <input id="btn" type="button" onclick="test();" /> <!--点击按钮 触发事件-->

这样有个很大的缺点就是:

HTML与js代码紧密耦合。如果要更换 事件,就要改动两个地方:HTML代码和JS代码,这就不利于后期代码的维护

2、用 on 绑定

兼容性:在IE,FF,Chrome,Safari,Mozilla,Opera下都适用。

  1. <body>
  2. <div id="id">on绑定事件</div>
  3. <script>
  4. var div=document.getElementById('id');
  5. // 甲
  6. div.onclick=function(){
  7. console.log('甲需要红背景');
  8. div.setAttribute('style', 'background: #ff0000');
  9. };
  10. // 乙
  11. div.onclick=function(){
  12. console.log('乙需要黄背景');
  13. div.setAttribute('style', 'background: #ffff00');
  14. };
  15. //这里最总只会输出 '乙需要黄背景' 因为用on绑定事件 同一事件下面会覆盖上面的
  16. div.onclick=null; //解绑只要事件 = null 就可以了
  17. </script>
  18. </body>

优点:它最大的优点是就是兼容性很好,所有浏览器都支持。

缺点:同一个 dom 元素上,on 只能绑定一个同类型事件,后者会覆盖前者,不同类型的事件可以绑定多个。

这里就有一个问题,无法允许团队不同人员对同一元素监听同一事件但做出不用的响应。

3、 addEventListener、attachEvent 绑定事件

同一个 dom 元素上,用 addEventListener、attachEvent 可以绑定多个同类型事件。

但是,addEventListener 事件执行顺序按照事件绑定的先后顺序执行;attachEvent 事件执行顺序则是随机的。

1)addEventListener

  1. var oBox = document.getElementById("container");
  2. //绑定事件
  3. oBox.addEventListener("click",fn(),false);
  4. //解绑事件
  5. oBox.removeEventListener("click",fn(),false);
  6. function fn(){//执行代码}

参数说明

  1. 第一个参数:事件名称 比如onclick onmouseover
  2. 第一个参数:作为事件处理程序的函数
  3. 第一个参数:若为false,函数在冒泡阶段执行;若为true,函数在捕获阶段执行。默认为false。(有关冒泡和捕获单独抽时间讲)

注意:removeEventListener 第二个参数要和 addEventListener 指向 同一个函数 才能解绑成功。

2)attachEvent

  1. var oBox = document.getElementById("container");
  2. //绑定
  3. oBox.attach("click",fn());
  4. //解绑
  5. oBox.detach("click",fn());
  6. function fn(){//执行函数}

3)区别

总结下 addEventListener、attachEvent的区别

  1. 1)参数个数不一致
  2. addEventListener三个参数,attachEvent两个参数
  3. 2)兼容问题
  4. addEventListener 谷歌,火狐,IE11支持,IE8不支持
  5. attachEvent 谷歌火狐不支持,IE11不支持,IE8支持
  6. 3)this指向不同
  7. addEventListener 中的this是当前绑定事件的对象
  8. attachEvent中的thiswindow
  9. 4)事件命名不同
  10. addEventListener中事件的类型(事件的名字)没有on
  11. attachEvent中的事件的类型(事件的名字)有on

这里再说下 addEventListener、attachEvent相对于上面两种绑定事件的优缺点

优点 它们可以支持 绑定多个同类型事件

缺点 兼容性并不好,它们只兼容相对应的浏览器才有用。

三、事件的兼容

上面说了3种绑定事件和解绑事件的方法,如果实际开发中如果只使用一种方法,那么会产生要么无法满足同一元素监听同一事件但做出不用的响应,要么系统的兼容性会有问题。

所以需要一个兼容的方法。这里举一个完整的例子,包含兼容绑定事件 和 兼容解绑事件 ,也看下解绑的含义是什么。

完整代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>事件绑定和解绑</title>
  6. </head>
  7. <body>
  8. <input type="button" value="绑架事件" id="btn1"/>
  9. <input type="button" value="解绑事件" id="btn2"/>
  10. <script>
  11. //第一个按钮 同时绑定两个相同事件 执行不同方法
  12. addEventListener(my$("btn1"),"click",f1);
  13. addEventListener(my$("btn1"),"click",f2);
  14. //第二个按钮点击后 让第一个按钮第一个事件解绑
  15. my$("btn2").onclick=function () {
  16. removeEventListener(my$("btn1"),"click",f1);
  17. };
  18. function f1() {
  19. alert("第一个事件");
  20. }
  21. function f2() {
  22. alert("第二个事件");
  23. }
  24. function my$(id) {
  25. return document.getElementById(id);
  26. }
  27. //绑定事件的兼容
  28. function addEventListener(element,type,fn) {
  29. if(element.addEventListener){ //有没有用
  30. element.addEventListener(type,fn,false);
  31. }else if(element.attachEvent){ //有没有用
  32. element.attachEvent("on"+type,fn);
  33. }else{ //如果都不兼容 那就用这种来绑定事件
  34. element["on"+type]=fn;
  35. }
  36. }
  37. //解绑事件的兼容
  38. function removeEventListener(element,type,fnName) {
  39. if(element.removeEventListener){
  40. element.removeEventListener(type,fnName,false);
  41. }else if(element.detachEvent){
  42. element.detachEvent("on"+type,fnName);
  43. }else{
  44. element["on"+type]=null;
  45. }
  46. }
  47. </script>
  48. </body>
  49. </html>

运行结果

<img src="https://img2018.cnblogs.com/blog/1090617/201912/1090617-20191206222709557-1141478635.gif" style="border: 1px dashed rgb(255, 0, 0);" width=“700" height="160">

从运行结果我们很明显可以得出的结论:

  1. 1、一开始绑定事件的按钮 绑定了两个相同的事件。并且发现并没有发生事件覆盖,都成功了。
  2. 2、当点击解绑按钮后,它解绑是绑定按钮的第一个事件。
  3. 3、此时再点击绑定事件的按钮,发现只绑定了一个事件,因为另一个事件已经被解绑了。

参考

1、JS中几种绑定事件的方式

2、JS事件绑定的常用方式实例总结

3、javascript 中的事件机制

  1. 你如果愿意有所作为,就必须有始有终。(20)

JavaScript(1)---绑定事件、解除绑定事件的更多相关文章

  1. JavaScript Dom 绑定事件

    JavaScript  Dom 绑定事件 // 先获取Dom对象,然后进行绑定 document.getElementById('xx').onclick document.getElementByI ...

  2. ES之事件绑定,解除绑定以及事件冒泡、事件捕获

    绑定事件的处理方法任何元素都有事件属性,而绑定事件就是将这个事件与一个函数相连接. ①句柄事件dom.onXXX = function () {代码块} 以on开头的事件属于句柄事件兼容性非常好,但是 ...

  3. 前端(十五)—— JavaScript事件:绑定事件方式、事件的冒泡和默认事件、鼠标事件、键盘事件、表单 事件、文档事件、图片事件、页面事件

    JS事件:绑定事件方式.事件的冒泡和默认事件.鼠标事件.键盘事件.表单 事件.文档事件.图片事件.页面事件 一.事件的两种绑定方式 1.on事件绑定方式 document.onclick = func ...

  4. jquery之on()绑定事件和off()解除绑定事件

    off()函数用于移除元素上绑定的一个或多个事件的事件处理函数. off()函数主要用于解除由on()函数绑定的事件处理函数. 该函数属于jQuery对象(实例). 语法 jQuery 1.7 新增该 ...

  5. javascript事件委托,事件代理,元素绑定多个事件之练习篇

    <ul id="parent-list"> <li id="post-1">item1</li> <li id=&qu ...

  6. 浅谈jquery之on()绑定事件和off()解除绑定事件

    off()函数用于移除元素上绑定的一个或多个事件的事件处理函数. off()函数主要用于解除由on()函数绑定的事件处理函数. 该函数属于jQuery对象(实例). 语法 jQuery 1.7 新增该 ...

  7. javascript事件委托和jQuery事件绑定on、off 和one以及on绑定多个事件(重要)

    一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中, ...

  8. 学习javaScript必知必会(4)~事件、事件绑定、取消事件冒泡、事件对象

    1.常用的事件: ① onload:页面加载 ② onblur: 失去焦点 onfocus: 获取焦点 ③ onclick:点击 ④ onmouseover:鼠标经过 onmouseout:鼠标离开 ...

  9. 原生js绑定和解绑事件,兼容IE,FF,chrome

    主要是最近项目中用到了原生的js 解绑和绑定 事件  然后今天研究了一下,其实问题不大,不过要注意不要把单词写错了,今天我就找了好久单词写错了. 需求:当鼠标移上去以后,给Select加载元素,接着解 ...

随机推荐

  1. dotnet core 发布只有一个 exe 的方法

    在 dotnet core 发布的时候,会使用很多文件,这样发给小伙伴使用的时候不是很清真,本文告诉大家一个非官方的方法通过 warp 将多个文件打包为一个文件 和之前相同的方式发布一个 dotnet ...

  2. 判断是否是ie浏览器或者edge浏览器,引入特定的css

    判断是否是ie浏览器或者edge浏览器,引入特定的css 我本来要用ie浏览器专有的条件注释语句来引入,但是发现都没有效果,网上有说ie10之后的浏览器取消了条件语句,反正我是只要是IE都没有试出效果 ...

  3. dotnet 通过 HttpClient 下载文件同时报告进度的方法

    本文告诉大家一个简单的方法通过 HttpClient 下载文件,同时报告下载进度 通过 HttpClient 的 ContentLength 很多时候都可以拿到下载的内容的长度,通过 ReadAsyn ...

  4. SmartAssembly 使用方法

    SmartAssembly加壳工具,我还真的是不太喜欢给自己的程序加壳,觉得开源才是王道,但是没办法工作需要,需要有个加壳后与加壳前的对比,好吧谁叫咱只是程序员呢. 开始埋头苦干,找了半天也没找到合适 ...

  5. AutoCad 二次开发 Jig操作之墙块的拖动

    测试结果: 主要思路:选择一段多段线,使用封装的jig类进行实时拖动,其原理就是在拖动的时候,确定被拖动的边,我是选择离输入第一个点最近的边作为拖动边,有了这条边,就能确定需要实时更改的点了,然后当鼠 ...

  6. centos7搭建Fabric基础环境

    一.首先升级centos最新内核 参考https://www.cnblogs.com/sky-cheng/p/12146054.html 二.卸载旧版本docker [root@localhost ~ ...

  7. SpringBoot系列之集成Dubbo示例教程

    一.分布式基本理论 1.1.分布式基本定义 <分布式系统原理与范型>定义: "分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统" 分布式系统(d ...

  8. AssemblyScript基本使用与项目构建

    全局安装assemblyscript npm i -S AssemblyScript/assemblyscript glob 生成编译脚手架 npx asinit . 项目构建 npm run asb ...

  9. 推荐中的多任务学习-ESMM

    本文将介绍阿里发表在 SIGIR'18 的论文ESMM<Entire Space Multi-Task Model: An Effective Approach for Estimating Po ...

  10. notepad++中cmd运行中文乱码?

    notepad++中有中文内容时,cmd运行时中文显示乱码,如何处理? 设置-->首选项-->新建-->选择ANSI编码(注意现在的文件不会被转换,要重新把代码拷入修建的文件中才可以 ...