今天在http://www.jibbering.com/faq/faq_notes/closures.html读了有关javascript闭包的文章,发现有下面的代码,想学习一下,于是在自己的机器上跑了一遍,但没调通。其中getElementWithId()方法不知道是什么,在网上也找过,没找到。我索性把它改成document.getElementById,但是return obj[methodName](e, this); 行报了错误:对象不支持此属性或方法。不知道哪位大侠能帮我看一下.谢谢!function associateObjWithEvent(obj, methodName){ 
return (function(e){ 
e = e||window.event; 
return obj[methodName](e, this); 
}); 

function DhtmlObject(elementId){ 
var el = getElementWithId(elementId); 
if(el){ 
el.onclick = associateObjWithEvent(this, "doOnClick"); 
el.onmouseover = associateObjWithEvent(this, "doMouseOver"); 
el.onmouseout = associateObjWithEvent(this, "doMouseOut"); 


DhtmlObject.prototype.doOnClick = function(event, element){ 
... // doOnClick method body. 

DhtmlObject.prototype.doMouseOver = function(event, element){ 
... // doMouseOver method body. 

DhtmlObject.prototype.doMouseOut = function(event, element){ 
... // doMouseOut method body. 

...... -----------------------------------------------------------------------------------------
这是我的调试程序:<html>
<head><meta http-equiv=content-type content="text/html; charset=gb2312">
<title></title>
</head>
<body>
<div id="d" >HAHA</div>
<script type="text/javascript" language="JavaScript">
<!--
function associateObjWithEvent(obj, methodName){    return (function(e){
               e = e||window.event;
                return obj[methodName](e, this);
    });
}
function DhtmlObject(elementId){
      //var el = getElementWithId(elementId);
      var el = document.getElementById(elementId);
        if(el){
               el.onclick = associateObjWithEvent(this, "doOnClick");
        el.onmouseover = associateObjWithEvent(this, "doMouseOver");
        el.onmouseout = associateObjWithEvent(this, "doMouseOut");
        
    }
}
DhtmlObject.prototype.doOnClick = function(event, element){
    alert("click"); // doOnClick method body.
}
DhtmlObject.prototype.doMouseOver = function(event, element){
    alert("over"); // doMouseOver method body.
}
DhtmlObject.prototype.doMouseOut = function(event, element){
    alert("out"); // doMouseOut method body.
}
DhtmlObject("d");
  
-->
</script>
</body></html>

解决方案 »

  1.   

    没有问题啊。是不是原来的函数没有注释掉?
    <html>
    <head><meta http-equiv=content-type content="text/html; charset=gb2312">
    <title></title>
    </head>
    <body>
    <div id="d" >HAHA</div>
    <script type="text/javascript" language="JavaScript">
    function associateObjWithEvent(obj, methodName){  
    return (function(e){  
    e = e||window.event;  
    return obj[methodName](e, this);  
    });  
    }  function associateObjWithEvent(obj, methodName){  return (function(e){
      e = e||window.event;
      return obj[methodName](e, this);
      });
    }function DhtmlObject(elementId){
      //var el = getElementWithId(elementId);
      var el = document.getElementById(elementId);
      if(el){
      el.onclick = associateObjWithEvent(this, "doOnClick");
      el.onmouseover = associateObjWithEvent(this, "doMouseOver");
      el.onmouseout = associateObjWithEvent(this, "doMouseOut");
        
      }
    }
    DhtmlObject.prototype.doOnClick = function(event, element){
      alert("click"); // doOnClick method body.
    }
    DhtmlObject.prototype.doMouseOver = function(event, element){
      alert("over"); // doMouseOver method body.
    }
    DhtmlObject.prototype.doMouseOut = function(event, element){
      alert("out"); // doMouseOut method body.
    }
    var obj = new DhtmlObject("d");
    </script>
    </body>
    </html>
      

  2.   

    哦,忘了,你直接使用的对象定义,我用的是实例对象
    var obj = new DhtmlObject("d");
    和DhtmlObject("d")是不同的,因为你定义的那些方法在原型对象上,因此必须以实例对象才能访问那些方法。