论坛首页 AJAX版 JavaScript

attachEvent和addEventListener的疑惑。。

浏览 1447 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-12-12
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//ZH-CN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta name="generator" content="HTML Tidy, see www.w3.org">
        <meta http-equiv="Content-Type" content=
        "text/html; charset=UTF-8">
        <title></title>
    </head>
	<body>
		<input type="button" id="test" value="点击"/>
		<script type="text/javascript">
			function kk(n){
				this.k1=n;
				var obj=document.getElementById("test");
				obj.parentClass=this;
				this.show();
			}
			kk.prototype.show=function(){
				var obj=document.getElementById("test");
				
				if(obj.attachEvent){
					obj.attachEvent("onclick",this.clickEvt);
				}else if(obj.addEventListener){
					obj.addEventListener("click",this.clickEvt,false);
				}
				
//				obj.onclick=this.clickEvt;
			}
			kk.prototype.clickEvt=function(){
				alert(this.parentClass.k1);
				
//				alert("BI")
			}
			
			new kk("rain");
		</script>
	</body>
</html>


为什么上面代码在火狐中能行,在IE中就出错呢?

如果改为alert("BI");两个浏览器都能运行;

如果改用obj.onclick=this.clickEvt来绑定事件,alert(this.parentClass.k1)在IE和火狐都能运行;

琢磨着是不是this.parentClass.k1的this在两个浏览器中指代的对象不同,会不会是因为onclick和click的不同所引起的呢??希望各位同仁指点一下,谢谢
   
最后更新时间:2007-12-12
attachEvent不能指定this,this会指向window的bug而已
   
0 请登录后投票
最后更新时间:2007-12-12
写了一个你的改版,这种写法是ext的风格,充分利用闭包机制,解决this的问题
        <script type="text/javascript">   
            var obj = function(){
                var o = document.getElementById('test'),k1;
                return {
                    init:function(n){
                        k1 = n;
                        this.show();
                    },
                    show:function(){
                        o.attachEvent?o.attachEvent("onclick",this.clickEvt):o.addEventListener("click",this.clickEvt,false);
                    },
                    clickEvt:function(){
                        alert(k1);
                    }
                };
            }();
            obj.init('rain');  
   
0 请登录后投票
最后更新时间:2007-12-12
简单的这样
ele.addEventListener=function(a,b){
a+="on";
var temp=this;
this.attachEvent(a,function(e){b.call(temp,e)})
}

但是由于匿名函数给弄scope里面了,没办法拿引用remove了,所以只是为了学习用,实际当中可以把handler引用弄到对象上起个名字,就可以remove了
   
0 请登录后投票
最后更新时间:2007-12-13
好,谢谢楼上各位
上面那些代码要好好消化下了
   
0 请登录后投票
最后更新时间:2007-12-13
给出传统解法1:也是我常用的写法,两种浏览器通过
js 代码
  1.       
  2. "text/javascript">   
  3.       function kk(n)   
  4.       {   
  5.           this.k1 = n;   
  6.           this.show();   
  7.       }   
  8.          
  9.       kk.prototype.show = function()   
  10.       {   
  11.           var obj = document.getElementById("test");   
  12.           var kkk = this;   
  13.           obj.onclick = function(){   
  14.             kkk.clickEvt();   
  15.           }   
  16.       }   
  17.          
  18.       kk.prototype.clickEvt = function()   
  19.       {   
  20.           alert(this.k1);   
  21.       }   
  22.          
  23.       new kk("rain");   
  24.   
   
0 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛:
JavaEye推荐