2009-01-19 60 views
1

在JavaScript下面的代码给我的错误“this.callback不是一个函数如何回调函数添加到一个javascript类?

function ajaxRequest() 
{ 
    var httpObject; 

    this.open = open; 
    this.callback = function(){}; 

    function getHTTPObject() 
    { 
     if (window.ActiveXObject) 
      return new ActiveXObject("Microsoft.XMLHTTP"); 
     else if (window.XMLHttpRequest) 
      return new XMLHttpRequest(); 
     else 
     { 
      alert("Your browser does not support AJAX."); 
      return null; 
     } 
    } 

    function onstatechange() 
    { 
     if(httpObject.readyState == 4) 
     { 
      this.callback(httpObject.responseText); 
     } 

    } 


    function open(url, callback) 
    { 
     httpObject = getHTTPObject(); 
     if (httpObject != null) 
     { 
      httpObject.open("GET", url, true); 
      httpObject.send(null); 
      this.callback = callback; 
      httpObject.onreadystatechange = onstatechange; 
     } 
    } 
} 

为什么不开法治疗回调参数作为函数?

如果确实如此,那么为什么我不能把它称为onstatechange功能?

如何使这项工作?

回答

9

的原因是因为onstatechange被称为作为事件处理程序,并且this指针可能指向事件触发的对象,而不是指向ajaxRequest对象,如您所期望的那样。

下面的重写将this变量存储在onstatechange()函数有权访问的执行上下文中名为that的变量中。这应该解决问题。

长期和短期的这一切,如果你不完全理解JavaScript关闭和执行上下文,即使你做的,你是非常非常最好使用框架做你的AJAX请求。 jQuery和Prototype是不错的选择。

function ajaxRequest() 
{ 
    var httpObject; 

    this.open = open; 
    this.callback = function(){}; 
    var that = this; 

    function getHTTPObject() 
    { 
     if (window.ActiveXObject) 
       return new ActiveXObject("Microsoft.XMLHTTP"); 
     else if (window.XMLHttpRequest) 
       return new XMLHttpRequest(); 
     else 
     { 
       alert("Your browser does not support AJAX."); 
       return null; 
     } 
    } 

    function onstatechange() 
    { 
     if(httpObject.readyState == 4) 
     { 
       that.callback(httpObject.responseText); 
     } 

    } 


    function open(url, callback) 
    { 
     httpObject = getHTTPObject(); 
     if (httpObject != null) 
     { 
       httpObject.open("GET", url, true); 
       httpObject.send(null); 
       this.callback = callback; 
       httpObject.onreadystatechange = onstatechange; 
     } 
    } 
} 
相关问题