Javascript 中采用AJAX异步请求数据出错问题(没有搞清readystate几个状态)
2015-03-28 16:38
459 查看
今天在写用户验证的时候出现了一个问题,卡了一天,也是笨的要死了,总结下:
1.从用户界面获取用户的帐号和密码,点击登录
2.登录就会调用JS文件中的一个函数login(),login()中采用AJAX访问数据验证的PHP文件
3.验证返回后给出提示
先看错误代码,请求后输入正确信息总是弹出错误的提示:
function login()
{
var user = document.getElementById("TxtUserName").value;
var passwd = document.getElementById("TxtPassword").value;
xmlHttp = GetXmlHttpObject();
if(xmlHttp==null)
{
alert("您的浏览器不支持AJAX?");
return;
}
var url ="checkinfo.php"; //数据验证功能的PHP页面
url = url+"?user="+user+"&passwd="+passwd;
xmlHttp.onreadystatechange = statechanged;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}
function statechanged()
{
if(xmlHttp.readyState==4)
{
alert("成功");
}
else
alert("失败");
}
上述代码当你输入帐号密码后,点击提交,会出现5个弹出框,4个提示失败的,1个提示成功的。问题找了好久才发现,是因为readyState这个地方出现了错误:先看一下readystate的5种状态:
0:请求未初始化(还没有调用 open())。
1:请求已经建立,但是还没有发送(还没有调用 send())。
2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。
3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
4:响应已完成;您可以获取并使用服务器的响应了。
只有当状态提示为4的时候,我们才能够使用服务器返回的数据,其他状态下使用的将是不完整的数据,也就会出现错误。
xmlHttp.onreadystatechange = statechanged; 这行代码是说,每次有一个readystate状态改变就会调用一次statechanged函数,这个函数正是我们想要弹出的提示框函数,因为状态有5个,所以就弹出了5次,因为我们的代码是这样写的:
function statechanged()
{
if(xmlHttp.readyState==4) //当状态码为4的时候弹出1次成功
{
alert("成功");
}
else // 当状态码不为4的时候弹出1次失败,因为有0.1.2.3这4个状态码,每次改变状态,都会调用statechanged()1次,共4次,而每次因为状态码不是4,
所以就弹出1个“失败”,总共弹出4次失败,加上1次状态码为4的时候弹出成功就出现了5个提示框。
alert("失败");
}
弄清楚这个将代码改写解决问题:
if(xmlHttp.readyState==4) //只判断当与服务器交互完成的状态,即只有一次
{
if(xmlHttp.responseText=="OK") //通过服务器给返回的数据进行判断是否成功,当用户名密码与数据库比对成功,服务器端echo一个“OK” 如果不成功就什么都不返回
alert("成功");
else //没有收到服务器返回的消息则说明用户名和密码不匹配
alert("出错");
}
1.从用户界面获取用户的帐号和密码,点击登录
2.登录就会调用JS文件中的一个函数login(),login()中采用AJAX访问数据验证的PHP文件
3.验证返回后给出提示
先看错误代码,请求后输入正确信息总是弹出错误的提示:
function login()
{
var user = document.getElementById("TxtUserName").value;
var passwd = document.getElementById("TxtPassword").value;
xmlHttp = GetXmlHttpObject();
if(xmlHttp==null)
{
alert("您的浏览器不支持AJAX?");
return;
}
var url ="checkinfo.php"; //数据验证功能的PHP页面
url = url+"?user="+user+"&passwd="+passwd;
xmlHttp.onreadystatechange = statechanged;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}
function statechanged()
{
if(xmlHttp.readyState==4)
{
alert("成功");
}
else
alert("失败");
}
上述代码当你输入帐号密码后,点击提交,会出现5个弹出框,4个提示失败的,1个提示成功的。问题找了好久才发现,是因为readyState这个地方出现了错误:先看一下readystate的5种状态:
0:请求未初始化(还没有调用 open())。
1:请求已经建立,但是还没有发送(还没有调用 send())。
2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)。
3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
4:响应已完成;您可以获取并使用服务器的响应了。
只有当状态提示为4的时候,我们才能够使用服务器返回的数据,其他状态下使用的将是不完整的数据,也就会出现错误。
xmlHttp.onreadystatechange = statechanged; 这行代码是说,每次有一个readystate状态改变就会调用一次statechanged函数,这个函数正是我们想要弹出的提示框函数,因为状态有5个,所以就弹出了5次,因为我们的代码是这样写的:
function statechanged()
{
if(xmlHttp.readyState==4) //当状态码为4的时候弹出1次成功
{
alert("成功");
}
else // 当状态码不为4的时候弹出1次失败,因为有0.1.2.3这4个状态码,每次改变状态,都会调用statechanged()1次,共4次,而每次因为状态码不是4,
所以就弹出1个“失败”,总共弹出4次失败,加上1次状态码为4的时候弹出成功就出现了5个提示框。
alert("失败");
}
弄清楚这个将代码改写解决问题:
if(xmlHttp.readyState==4) //只判断当与服务器交互完成的状态,即只有一次
{
if(xmlHttp.responseText=="OK") //通过服务器给返回的数据进行判断是否成功,当用户名密码与数据库比对成功,服务器端echo一个“OK” 如果不成功就什么都不返回
alert("成功");
else //没有收到服务器返回的消息则说明用户名和密码不匹配
alert("出错");
}
相关文章推荐
- 关于AJAX请求服务器后缓存数据,造成没有及时刷新的问题
- [ajax]多个异步请求初始化JST渲染数据的时间差问题
- javascript Ajax 同步请求与异步请求的问题
- ajax异步请求不能刷新数据的问题
- 【javascript】ajax请求 编码问题导致的ie浏览器在输入中文文字后没有内容,而chrome正常搜到文字
- js中请求数据的$post和$ajax区别(同步和异步问题)
- 解决ajax请求出错状态码为0的问题
- 快速解决ajax请求出错状态码为0的问题
- 记录问题:登录session过期,ajax请求被web security拦截,页面没有数据且没有重定向到login页面
- javascript之ajax请求数据demo
- jquery的ajax异步请求接收返回json数据
- 解决axios跨域请求出错的问题状态码403错误
- jquery的ajax请求成功OK,返回了数据,但是不进success的问题解决办法
- 解决vue跨域请求无法携带cookie,进而无法在服务器端设置session保持数据(状态)的问题
- iOS 信号量解决-网络异步请求的数据同步返回问题
- ajax中的异步请求,导致数据顺序可能有问题,改成ajax同步的就好了,
- ajax异步请求出现的问题
- 采用ajax请求返回得到json数据,但是获取具体项却为undefined
- 关于Ajax异步请求后台数据进行动态分页功能
- 从零开始学 Web 之 Ajax(五)同步异步请求,数据格式