JavaScript事件绑定常用方法

  • 对象.事件 = 函数;

    它只能同时为一个对象的一个事件绑定一个响应函数

    不能绑定多个,如果有多个,后面的会覆盖前面的

  • addEventListener()

    此方法也可以为元素绑定响应函数

    参数:

    1. 事件的字符串(不带on)
    2. 回调函数,事件触发时执行
    3. 是否在捕获阶段触发事件,一般都传false

    使用此方法可以为一个元素的同一事件绑定多个响应函数

    当事件触发时,按绑定顺序依次执行

  • attachEvent()

    IE8及以下浏览器不支持addEventListener()方法,但可以使用attachEvent()方法起到同样的效果

    参数:

    1. 事件字符串(带on)
    2. 回调函数

    此方法也可以绑定多个函数,不过函数执行顺序与addEventListener()相反

  • this问题与解决

    addEventListener()中的this是绑定事件的对象

    attachEvent()中的this是window

    如果要解决兼容性问题则需要统一两个方法的this

    这里我们用到了call()方法

    call()可以用来改变函数的this

自建函数bind()

自己定义一个函数用来给一个对象绑定事件

  • 思路

    三个参数:对象,事件,回调函数

    兼容性:

    • 通过if判断对象是否存在addEventListener方法来区分浏览器

    • this问题的解决

      由于传入的回调函数是浏览器调用的,我们无法去操作,所以我们在attachEvent()不直接传入回调函数,而是先定义一个匿名函数,然后在函数内部调用回调函数,并利用call方法改变this

示例代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
window.onload = function(){
var btn1 = document.getElementById("btn1"); bind(btn1, "click",function(){
alert(this);
}); };
//定义一个函数bind(),用来为指定元素绑定事件响应函数
/*
* 参数:
* obj 要绑定事件的对象
* eventStr 事件的字符串
* func 回调函数
*/
function bind(obj, eventStr, func){
//判断是否有addEventListener()方法
if(obj.addEventListener){
//大部分浏览器兼容的方式
obj.addEventListener(eventStr, func, false);
}
else{
//IE8及以下 注意 on
//obj.attachEvent("on"+eventStr, func);//此方法this为window下面提供解决方法 //统一this 不直接调用func而是在匿名函数内调用
obj.attachEvent("on"+eventStr, function(){
//在匿名函数内调用回调函数 利用call()方法将this改为obj
func.call(obj);
});
}
};
</script>
</head>
<body>
<button id="btn1">btn1</button>
</body>
</html>

JS事件之自建函数bind()与兼容性问题解决的更多相关文章

  1. window.addEventListener来解决让一个js事件执行多个函数

    可能你也碰到过这种情况,就是在js的代码中用了window.onload后,可能会影响到body中的onload事件.这时就要用window.attachEvent和window.addEventLi ...

  2. Node.js事件的正确使用方法

    前言 事件驱动的编程变得流行之前,在程序内部进行通信的标准方法非常简单:如果一个组件想要向另外一个发送消息,只是显式地调用了那个组件上的方法.但是在 react 中用的却是事件驱动而不是调用. 事件的 ...

  3. 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别

    一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...

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

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

  5. js事件绑定的几种方式与on()、bind()的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载 一直不是很理解几种js事件绑定之间的区别与联系,今天百度了一下,在此做一总结: 1.如果只是简单的绑定一个事件,可以直接写在行内,点击执行一个函数, ...

  6. 为什么JS事件函数里面都有一个参数(ev)?

    因为ev是事件的参数啊!在ev中包含了事件触发时的参数,比如click事件的ev中包含着.e.pageX,e.pageY,keydown事件中包含着ev.keyCode等,在ie中,ev是全局的可以通 ...

  7. Node.js:创建应用+回调函数(阻塞/非阻塞)+事件循环

    一.创建应用 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi.从这个角度看,整个"接收 HTTP ...

  8. js事件函数中(ev)是什么鬼?

    首先,从ev所在的位置就可以得知,ev是参数. 在ev中包含了事件触发时的函数, 比如: click事件的ev中包含着e.pageX,e.pageY keydown事件中包含着ev.keyCode等 ...

  9. JS事件-对象监视事件,事件触发函数

    写在前面: 一句话作为本文的核心思想:对象监视事件,事件触发函数: (一)事件 1.事件分类 (1)鼠标事件 click()                      鼠标单击 dblclick()  ...

随机推荐

  1. UVA_445:Marvelous Mazes

    Language:C++ 4.8.2 #include<stdio.h> #include<string.h> #include<ctype.h> int main ...

  2. 【算法】leetcode之 Palindrome Partitioning I&II(转载)

    1 Palindrome Partitioning 问题来源:Palindrome Partitioning 该问题简单来说就是给定一个字符串,将字符串分成多个部分,满足每一部分都是回文串,请输出所有 ...

  3. Warning!程序员们小心被技术绑架

    通常我们说程序员需要在某个技术方向上积累到一定的厚度,要能够运用技术有效地解决实际问题.可是当程序员在某一项技术上浸淫时间长了之后,却经常会出现另外的问题,那就是:看待问题时受限于自身的技术积累. 我 ...

  4. Vue.js 第3章 axios&Vue过渡动画

    promise 它将我们从回调地狱中解脱出来 创建和使用 var fs = require('fs') // 创建promise // reslove表示执行成功后调用的回调函数 // reject表 ...

  5. jQuery 无刷新评论

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 使用epoll实现简单的服务器

    1. 头文件 #ifndef __TCP_SERVER_H__ #define __TCP_SERVER_H__ #include <unistd.h> #include <stdi ...

  7. Mysql查询某个月的每一天的数据

    需求:查询最近三个月的每一天的业绩总和 因为最近三个月每个月的天数是不一样,所以不能用这篇文章:Mysql查询最近30天的数据(每天的业绩总和数据) 介绍的用固定多少天去查数据.需要一个新方法. 一. ...

  8. @codeforces - 1205D@ Almost All

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 个点的无向树. 请在每条边上写上权值,使得对于每一 ...

  9. HZOI20190714 T1序列

    什么沙雕题啊……考察的是啥啊,分类咋搞啊……愁死我了…… 先把作者的正解放出来: 序列因为选出的一段是一个等比序列的子序列,我们分为两种情况:1. q=1,相当于找一个最长每个数都相等的子串,这个扫一 ...

  10. CSDN-Java培训 - 看看这次会有多少人跟风...

    2019年5月8日,闲来无事(最近答辩还没事......),存个档. 看看这一波风口,记录互联网+教育.