作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下 JavaScript 代码给出了错误“this.callback 不是函数
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;
}
}
}
为什么open方法不把回调参数当作函数处理?
如果是的话,为什么我不能在 onstatechange 函数中调用它?
我该如何完成这项工作?
最佳答案
原因是因为 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;
}
}
}
关于javascript - 如何向 javascript 类添加回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456767/
我是一名优秀的程序员,十分优秀!