解决使用attachEvent函数时,this指向被绑定的元素的问题的方法


Posted in Javascript onAugust 13, 2007

使用attachEvent对同一事件进行多次绑定,这是解决事件函数定义冲突的重要方法。但是在IE中,函数内的this指针并没有指向被绑定元素,而是function对象,在应用中,这是很难受的一件事,如果试图用局部变量传送元素,会因为闭包而引起内存泄漏。那么,我们应该如何解决这一难题呢?

   我给Function添加了原型方法“bindNode”,在这个方法里,根据传送过来的元素,进行全局性存储转换,然后返回经过封装的函数,使用call方法来进行属主转换。

<html>
<body>
<button id=btTest>test</button>
</body>
</html>
<script>
if(!document.all){
   HTMLElement.prototype.attachEvent=function(sType,foo){
       this.addEventListener(sType.slice(2),foo,false)
   }
}
Function.prototype.bindNode=function(oNode){
   var foo=this,iNodeItem

   //使用了全局数组__bindNodes,通过局部变量iNodeItem进行跨函数传值,如果直接传送oNode,也将造成闭包
   if(window.__bindNodes==null)
       __bindNodes=[]
   __bindNodes.push(oNode)
   iNodeItem=__bindNodes.length-1
   oNode=null
   return function(e){
       foo.call(__bindNodes[iNodeItem],e||event)
   }
}
abc()
function abc(){
   var bt=document.getElementById("btTest")
   bt.attachEvent("onclick",function(){

       //如果不经过bindNode处理,下面的结果将是undefined
       alert(this.tagName)
   }.bindNode(bt))
   bt=null
}
</script>

Javascript 相关文章推荐
五段实用的js高级技巧
Dec 20 Javascript
如何解决Jquery库及其他库之间的$命名冲突
Sep 15 Javascript
使用不同的方法结合/合并两个JS数组
Sep 18 Javascript
jquery 设置style:display的方法
Jan 29 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
May 10 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
jquery实现input框获取焦点的简单实例
Jan 26 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
Jun 04 Javascript
js实现移动端轮播图效果
Dec 09 Javascript
vue里面使用mui的弹出日期选择插件实例
Sep 16 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
Jul 31 Javascript
ES6 Iterator接口和for...of循环用法分析
Jul 31 Javascript
Track Image Loading效果代码分析
Aug 13 #Javascript
不错的JS中变量相关的细节分析
Aug 13 #Javascript
javascript-TreeView父子联动效果保持节点状态一致
Aug 12 #Javascript
TopList标签和JavaScript结合两例
Aug 12 #Javascript
Javascript-Mozilla和IE中的一个函数直接量的问题分析
Aug 12 #Javascript
IE和Mozilla的兼容性汇总event
Aug 12 #Javascript
收藏Javascript中常用的55个经典技巧
Aug 12 #Javascript
You might like
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
几个实用的PHP内置函数使用指南
2014/11/27 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
PHP7常量数组用法分析
2016/09/26 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
python中MethodType方法介绍与使用示例
2017/08/03 Python
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
Python BS4库的安装与使用详解
2018/08/08 Python
python移位运算的实现
2019/07/15 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
如何给Python代码进行加密
2020/01/10 Python
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
年会主持词结束语
2014/03/27 职场文书
环保建议书600字
2014/05/14 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
军事博物馆观后感
2015/06/05 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书