封装一个事件绑定函数

function addEven(obj,type,fn)
{
   if(obj.attachEvent)
 {
   obj.attachEvent('on'+type,fn); 
  }
 else
 {
   obj.addEventListener(type,fn,false); 
 }
}

在ie下弹出this的时候不会弹出标签对象本身,而是弹出window,先来看看call()方法:函数的调用如a();实际上等同于a.call();

例如有这样一个函数function a(){alert(this)}  这时结果是window,如果这样调用a.call('aaa');会弹出aaa,也就是说call里面的变量会改变函数this的值。

因此封装绑定函数就可以调用call,这样来做

function addEven(obj,type,fn)
{
   if(obj.attachEvent)
 {
   obj.attachEvent('on'+type,function(){
      fn.call(obj)//里面的this的值变成obj 变成当前调用的标签对象
    }); 
    }
 else
 {
   obj.addEventListener(type,fn,false); 
 }
}

再进一步用三目运算优化就可以这样做

function addEven(obj,type,fn)
{
  return obj.attachEvent ? obj.attachEvent('on'+type,function(){fn.call(obj)}) : obj.addEventListener(type,fn,false); 
}

搞定

转载于:https://www.cnblogs.com/thinksley/archive/2012/11/28/2792258.html

封装事件绑定函数解决this在ie下的绑定问题相关推荐

  1. JavaScript封装一个注册函数解决兼容问题

    我们知道JavaScript注册(绑定)事件主要有两类方式,第一类传统方式具有注册事件的唯一性,即对于同一元素的同一事件,不会出现两个处理函数,如下 var btn = document.queryS ...

  2. JS之事件处理(一)--事件概述、非IE浏览器/IE浏览器中的事件绑定、解决浏览器事件绑定兼容性问题

    一.概述 描述:事件本质是一种交互操作,事件通常与函数配合使用,当事件发生时函数才会执行 事件是由三部分组成的:事件源 事件类型 事件处理程序 事件源:事件被触发的对象–谁 事件类型:如何触发 什么事 ...

  3. js循环绑定事件问题及解决方法

    js初学者经常遇到的循环绑定事件问题 js循环绑定事件 在编写JS代码的时候,我们经常会遇到要对一系列元素进行事件绑定的情况,然后就会理所当然的开一个for循环,对元素的事件进行赋值等操作,最后运行的 ...

  4. [vue] vue给组件绑定自定义事件无效怎么解决?

    [vue] vue给组件绑定自定义事件无效怎么解决? 两种方式 1.组件外部加修饰符.navtive 2.组件内部声明$emit('自定义事件') 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放 ...

  5. html onblur 函数执行了2次,JavaScript“onblur事件”调用函数失效 原因与解决方法

    由于JavaScript事件有很多,例如: 鼠标事件:onclick 键盘事件:onkeydown.onkeypress 表单事件:onblur.onchange 窗口事件属性:onerror.onl ...

  6. 给动态动态生成元素绑定事件不生效解决方法

    如题:动态生成的元素绑定事件后没有生效,或者说操作时没有效果 js,jq动态生成的元素,在绑定前,先一定要确认,执行绑定操作的时候,该元素是不是已经存在在页面上,也就是html上了,假如执行绑定的时候 ...

  7. 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链)

    你不走出舒适圈,又怎么知道自己多坚强?! 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链) 前端面试 - JS总结(2) - ES6 (let, 箭头函数, this) 前 ...

  8. ajax点击事件无法触发,解决jQuery Ajax动态新增节点无法触发点击事件的问题_婳祎_前端开发者...

    在写ajax加载数据的时候发现,后面添加进来的demo节点元素,失去了之前的点击事件.为什么点击事件失效,我们该怎么去解决呢? 其实最简单的方法就是直接在标签中写οnclick="" ...

  9. 关于前台调用后台事件__doPostBack函数

    关于前台调用后台事件__doPostBack函数 作者:admin 日期:2006-04-11 字体大小: 小 中 大 这里需要提一下的是,asp.net编程提供了服务端控件和客户端控件的说法,其实还 ...

最新文章

  1. oracle rac服务供应商,【Oracle Database】Oracle RAC(八):服务资源管理
  2. python中 [ 闭包 ] 小结
  3. Incorrect string value: '\xE8\x8B\x8F\xE6\x99\xA8...' for column 'user_name' at row 1
  4. 基于ubuntu20.4安装谷歌拼音中文输入法
  5. 2021年特种设备气瓶充装(全国特种设备-P气瓶充装模拟考试题库一)安考星
  6. Linux运维工程师简历项目经验
  7. 网络对战五子棋(web-gobang)项目
  8. 用cookie实现查看浏览记录
  9. java map.put map_java中map的put方法
  10. 无线蓝牙打印机服务器有什么用,蓝牙打印机价格怎么样 蓝牙打印机有什么用途...
  11. Adobe证书含金量
  12. ajax asp后台获取不到post数据,asp.net webapi [FromBody]string 获取不到ajax post的数据的解决方法...
  13. Python绘画可爱的哆啦A梦
  14. shell循环loop
  15. Win10 64位+VS2015+Opencv3.3.0安装配置
  16. envi查看灰度直方图_2.ENVI软件操作基础——查看数据属性特征
  17. 疫情仍在的2020,同城配送软件为何成为商家喜爱?
  18. Qt 获取本地IP 和 本地主机名称
  19. 【空间单细胞组学】第2期:乳腺癌患者经anti-PD1治疗后,肿瘤内变化的单细胞图谱
  20. 自考计算机app软件排行,自考软件哪个好 免费的自考软件推荐

热门文章

  1. realloc函数在使用上要注意什么问题
  2. 《java多线程编程实战指南 核心篇》读书笔记二
  3. 广西梧州举办警察半程马拉松邀请赛 3000多人开跑
  4. redis的bitset实战
  5. mysql-proxy读写分离
  6. CentOS虚拟机克隆后网卡配置问题
  7. Ubuntu init启动流程分析浅析
  8. 戴尔推免费浏览器安全工具 可隔离恶意软件
  9. linux上传下载文件
  10. 树莓派 使用读卡器修改WIFI连接配置