在学习js的类,把ajax封装成了类,以下是主代码
<script>
var ajax = new class_ajax();
window.onload = function()
{
sdmessage();
}


function sdmessage()
{
alert(ajax.open("http://192.168.1.63/login/json.php?get=json", "GET"));
ajax.change(function()
{
if (ajax.state == 4)
{
if (ajax.status == 200)
{
document.write(ajax.text);
}
}
});
ajax.send(null); }
</script>
被调用的类代码
function class_ajax()
{
var request;
this.state;
this.status;
this.text; var browser = navigator.appName;
if(browser != "Microsoft Internet Explorer")
{
request = new XMLHttpRequest();
}else{
var arrVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
for (var i=0; i < arrVersions.length; i++)
{
try
{
request = new ActiveXObject(arrVersions[i]);
}
catch(exception)
{
}
}
} this.open = function(url, method)
{
return request.open(method, url, true);
}

this.send = function(data)
{
request.send(data);
}

this.change = function(handle)
{
request.onreadystatechange = function()
{
this.state = request.readyState;
alert(request.readyState);
this.status = request.status;
alert(request.status);
this.text = request.responseText;
handle();
}
request.send(null);
}
}服务器端Php代码
<?php
if ($_GET['get'] == 'json')
echo 'hello';
?>
ajaxjavascriptxmlhttprequest

解决方案 »

  1.   

    我试了下没有问题你把alert(ajax.open("http://192.168.1.63/login/json.php?get=json", "GET"));
    改成相对路径试下
      

  2.   

    还有个问题,下面的两个send去掉一个,不然会报错,你这个ajax现在还不能发送post请求,如果是post请求,你还要执行一下requrest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')。
      

  3.   


    哦,是了,忘记了,我在我电脑上该了host,把一个临时域名直接指向了192.168.1.63。
    然后文件里直接请求192.168.1.63。
    域名不一样,应该被判断为跨域请求了,所以拒绝提交,调试器给出的错误提示也是NS_ERROR_FAILURE: Failure
    我百度了一下,好像是跨域请求的意思
      

  4.   

    还有一个问题是我从类外请求类里的变量"ajax.state"、"ajax.status"、"ajax.text",得到的结果都是undefined
    类的公有变量应该怎么声明?
    是不是我的方法不正确?
    你昨天的发的你以前封装的ajax类如果改成function Ajax(){ 变量函数}的方式应该怎么写?我从网上没有找到正规的js类的声明方法,所以你的类的写法我没看懂
      

  5.   

    这个是你的this的问题,你以前那样写,this指的是request对象,不是实例ajax对象。改成下面那样。
    this.change = function(handle) {
    var _this = this;
    request.onreadystatechange = function() {
    _this.state = request.readyState;
    //alert(request.readyState);
    _this.status = request.status;
    //alert(request.status);
    _this.text = request.responseText;
    handle();
    }
    //request.send(null);
    }
      

  6.   


    哦,意思是我在类里的function中使用this,那么this指的就是函数自己了是吗?
    比如我在类里有函数open,那么在open函数里使用this就是指的open函数自己是吧。想想也是,我声明类也是用的function,然后里面嵌套的还是function,this确实不应该代表外层的function
      

  7.   


    LZ先打好基础吧,你在open中使用this,this不是指向open函数,而是ajax对象,你不信的话打印一下
    alert(this==this.open)//alert(this==arguments.callee);后面这个也可以
    alert(this==ajax)
    看一下第一个是不是false,第二个是不是true
      

  8.   


    真是谢谢你了~顺带着再问你另一个问题吧:
    我在html主结构里的form中加属性onsubmit="xxx(); return false;"
    表单项里用input type="submit"
    然后调试,当我打开网页,第一次点按钮很正常,页面无刷新,指定函数被执行。
    然而当我把我的函数里alert弹出的提示框关了以后再点一次按钮,这次函数就不会被执行了,并且页面被刷新,很奇怪。我浏览器的原因吗?我用的最新版的火狐
      

  9.   


    这应该不是浏览器的问题,因为你的代码出问题了,程序中断了,没有执行到return false;所以表单提交了。仔细检查一下吧。
      

  10.   

    有必要找本js的书看看了~我学php,在网上找ajax方面的资料,总是那么残缺~js也没有php那么强大完善又系统的文档资料