ajax的onreadystatechange问题

anqier01 2008-05-26 08:45:46
各位前辈,如下程序,function processRequest()函数里的xmlhttp代码都没被执行,我测试了xmlhttp.readyState==4和
xmlhttp.status==200都为真,而且在函数体的第一行放入alert(“1”)测试都有5个1出来,表明状态确实改变了5次,可是只要函数里一放入xmlhttp属性代码就都没办法执行下去,后来我把alert(xmlhttp.responseText);直接放到xmlhttp.send(null);后面,我想要的数据就出来了,说明xmlhttp的属性都有取值的,可为什么就是在processRequest()里这些代码都得不到执行呢?请大家知道的帮忙解决下哦,郁闷死了。。。。

function doAjax(url){
var xmlhttp;

try{

xmlhttp = new ActiveXObject("Msxm12.XMLHTTP");
}catch(e){

try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
try{
xmlhttp = new XMLHttpRequest();
if(xmlhttp.overrideMimeType){
xmlhttp.overrideMimeType("text/xml");
}
}catch(e){}
}

}
//alert("3");
if(!xmlhttp){
window.alert("不能创建XMLHttpRequest对象实例");
return false;
}

xmlhttp.onreadystatechange = processRequest;

xmlhttp.open("get",url,true);
xmlhttp.send(null);
//alert(xmlhttp.responseText);

}
function processRequest(){

if(xmlhttp.readyState==4){

if(xmlhttp.status==200){

alert(xmlhttp.responseText);
}else{
alert("请求处理返回的数据有异常");
}
}else{ alert("处理数据未返回");}

}
function dataCheck(){
var f=document.form1;
var username=f.UserName.value;
if(username=="")
{
alert("用户名为空");
f.UserName.focus();
return false;
}else{
//alert("2");
doAjax("check.jsp?username="+username);
}
}

...全文
224 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingyuan0824 2008-06-01
  • 打赏
  • 举报
回复
open方在上面,不发送怎么能收到服务器给的返回值那?
workey 2008-05-27
  • 打赏
  • 举报
回复
<script language="javascript">
var xmlhttp;
function doAjax() {
try {
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
} catch(e) {
try {
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
} catch(e) {
try {
xmlhttp = new XMLHttpRequest();
} catch(e) {
alert("创建XMLHttpRequest对象失败!");
}
}
}
return xmlhttp;
}

function ajax(url){
doAjax();
xmlhttp.open("GET",url,true);
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4){
if(xmlhttp.status == 200){
alert(xmlhttp.responseText);
}
}
}
xmlhttp.send(null);
}

function dataCheck(){
if(document.form1.UserName.value.length<1){
alert("用户名为空");
document.form1.UserName.focus();
return false;
}
else{
Ajax("check.jsp?username="+username);
}
}

</script>
workey 2008-05-27
  • 打赏
  • 举报
回复
function doAjax(url){
var xmlhttp;
声明为全局就是

var xmlhttp;
function doAjax(url){

得把变量放到函数外面
jackyzsy2008 2008-05-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 workey 的回复:]
照我的理解,onreadystatechange是测试状态的,但是状态应该是基于发生事件以后的状态,
那么open是不是就是发生事件呢?open事件发生以后,在用onreadystatechange来检查open事件进行的状态?
我是这么理解的,不知道对不对。
[/Quote]

你的理解不对,open也是一种状态
0:请求未初始化(还没有调用 open())。
1:请求已经建立,但是还没有发送(还没有调用 send())。
2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。
3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
4:响应已完成;您可以获取并使用服务器的响应了。

onreadystatechange会在每一次状态改变都回调处理函数(processRequest)所以lz看到5个alert。如果写到open之后,就只能看到4个alert。你们可以试试
jackyzsy2008 2008-05-27
  • 打赏
  • 举报
回复
processRequest这个函数貌似不能访问你的xmlhttp对象吧,你的xmlhttp又不是全局的,processRequest咋知道这是个什么玩意?把你的xmlhttp对象声明为全局对象
good luck
workey 2008-05-27
  • 打赏
  • 举报
回复
照我的理解,onreadystatechange是测试状态的,但是状态应该是基于发生事件以后的状态,
那么open是不是就是发生事件呢?open事件发生以后,在用onreadystatechange来检查open事件进行的状态?
我是这么理解的,不知道对不对。
workey 2008-05-27
  • 打赏
  • 举报
回复
xmlhttp.open("get",url,true);
xmlhttp.onreadystatechange = processRequest;
xmlhttp.send(null);


你用这个顺序试试
workey 2008-05-27
  • 打赏
  • 举报
回复

我也不太懂,但是我看别人程序好像都把onreadystatechange放到open下面。
xmlhttp.open("get",url,true);
xmlhttp.send(null);

xmlhttp.onreadystatechange = processRequest;

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧