我正在练习AJAX,因为我编写了一个代码来从服务器中的文件中获取文本,如果是“0”则打印“零”或如果错误打印“未连接”则打印“一”。但是出了点问题不知道即使连接起来也只是没有连接......
这是代码:
<html>
<head>
<title>LogIN</title>
<script>
function verify()
{
var xml;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xml=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xml=new ActiveXObject("Microsoft.XMLHTTP");
}
xml.onreadystatechange=function()
{
if (xml.readyState==4 && xml.status==200)
{
var res=xml.responseText();
if(res.equals("0"))
{
document.write("zero");
}
else
{
document.write("one");
}
}
else
document.write("Not connected");
}
xml.open("GET", "log_verify.txt", true);
xml.send();
}
function login()
{
//action to login
}
</script>
</head>
<body>
<form>
User name : <input type="text" name="uname" onblur="verify()">
<br>
Pwd : <input type="password" name="passwd" >
<br>
<input type="button" name="Login" value="Login" onclick="login()">
</form>
</body>
</html>
获取输出
未连接未连接未连接
但是当我只显示响应文本时,它会根据下面的代码正确打印
<html>
<head>
<title>LogIN</title>
<script>
function verify()
{
var xml;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xml=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xml=new ActiveXObject("Microsoft.XMLHTTP");
}
xml.onreadystatechange=function()
{
if (xml.readyState==4 && xml.status==200)
{
document.getElementById("myDiv").innerHTML+=xml.responseText;
}
}
xml.open("GET", "log_verify.txt", true);
xml.send();
}
function login()
{
//action to login
}
</script>
</head>
<body>
<form>
User name : <input type="text" name="uname" onblur="verify()">
<br>
Pwd : <input type="password" name="passwd" >
<br>
<input type="button" name="Login" value="Login" onclick="login()">
</form>
<div id="myDiv"><h2>Response text:</h2></div>
</body>
</html>
获取输出
回复文字:
0
是javascript编码中的问题还是服务器响应中的某个问题?
答案 0 :(得分:3)
在您编写xml.responseText()
的第一个片段中,导致脚本终止。
在第二个片段中,你做对了,写了xml.responseText
。这是一个文本属性,而不是函数。
关于“未连接”消息,没有问题。
你假设,当onreadystatechange
被解雇时,(xml.readyState==4 && xml.status==200)
如果连接,则相反,如果没有连接。
但事实并非如此。
在XMLHttpRequest的生命周期中,如果连接成功,onreadystatechange
会多次触发,在请求进行时跟踪对象的各种状态。
这些状态(将其值提供给.readyState
)列在section 3.5 of the relevant W3C spec下:
UNSENT
(数值0)该物体已经建成。
OPENED
(数值1)已成功调用open()方法。在这种状态下 可以使用setRequestHeader()和请求设置请求标头 可以使用send()方法进行。
HEADERS_RECEIVED
(数值2)已遵循所有重定向(如果有)以及所有HTTP标头 已收到最终答复。几位回应成员 对象现在可用。
LOADING
(数值3)正在接收回复实体。
DONE
(数值4)数据传输已完成或出现问题 转移期间(例如无限重定向)。
当对象进入DONE
状态时,您使用条件仅执行代码 ,而不是因为任何其他状态指示失败。
DONE状态有一个相关的错误标志,指示某种类型的网络错误或堕胎。它可以是true或false,初始值为false。
如果您想查找此失败,请查看.state
媒体资源which has the following possible values:
- 如果状态为UNSENT或OPENED,则返回0并终止这些 步骤。
- 如果错误标志为true,则返回0并终止这些步骤。
- 返回HTTP状态代码。
所以:
xml.onreadystatechange = function() {
if (xml.readyState != 4) { // handle DONE only
return;
}
if (xml.status == 0) { // error
document.getElementById("myDiv").innerHTML += "Connection error"
}
else if (xml.status == 200) { // HTTP 200 OK
document.getElementById("myDiv").innerHTML += xml.responseText;
}
else { // some other HTTP code
document.getElementById("myDiv").innerHTML += "HTTP response code " + xml.status;
}
}
答案 1 :(得分:1)
首先,
else
document.write("Not connected");
只要状态发生变化且状态不是4
和200
,就会执行。它并不一定意味着Not connected
。你可以删除那部分。当状态从0
更改为1
到2
再到3
(以及4
时,您目前看到它三次,但这不会转到else
)。
其次,您正在使用.equals
,但此功能本身不可用,您也没有定义它。你在寻找:
if(res == "0")
==
是相等运算符。和,
res = xml.responseText;
它不是一个函数,所以你不应该追加()
。