我在ajax中做这个教程,我不理解调用函数的一行。 (代码中的第6行)
// this is called from an onload event in the html body tag
function process() {
if (xmlHttp) {
try {
xmlHttp.open("GET", "hello.txt", true);
xmlHttp.onreadystatechange = handleServerResponse; ***** THIS LINE HERE
xmlHttp.send(null);
} catch(e) {
alert(e.toString());
}
};
}
handleServerResponse = function() {
theD = document.getElementById('theD');
if (xmlHttp.readyState == 1) {
theD.innerHTML += "Status 1: server connectino established <br />";
} else if (xmlHttp.readyState == 2) {
theD.innerHTML += "Status 2: request recieved <br />";
} else if (xmlHttp.readyState == 3) {
theD.innerHTML += "Status 3: server processing task <br />";
} else if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
try {
text = xmlHttp.responseText;
theD.innerHTML += 'status 4: request completed, response delievered.';
theD.innerHTML += '<br />' + text;
} catch(e) {
}
} else {
alert("request cannont be completed by server (status 4)");
};
};
}
为什么我不用括号称它?喜欢:xmlHttp.onreadystatechange = handleServerResponse();
当我这样做时,似乎只调用该函数一次,因为它只打印出状态2.但没有括号,但当函数被声明为变量时,似乎每次状态改变时都会调用它。这是为什么?
另外,为什么xmlHttp.onreadystatechange属性执行多次? body标签只能加载一次,因此只调用一次函数。为什么会循环?
我肯定错过了一些东西,无论是与ajax相关的对象还是javascript函数调用。
除了下面的答案,这里是对过程函数中“true”和“null”参数的一个很好的解释:http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp
答案 0 :(得分:1)
为什么我不用括号称它?喜欢: xmlHttp.onreadystatechange = handleServerResponse();
因为在这一行上你并没有打电话给这个功能。您只是订阅一个事件(一个回调),稍后将由xmlHttp
实例调用,并且当AJAX请求从服务器获得一些响应时。
当您致电xmlHttp.send(null);
时,AJAX请求将被发送到服务器进行处理。此函数立即返回,并执行下一行代码。稍后,当服务器完成执行请求后,它将返回一些状态代码以及响应正文。正是在那一刻,实际的handleServerResponse
函数才会被执行。
答案 1 :(得分:0)
handleServerResponse实际上是对函数本身的引用。添加括号实际上会调用该函数并将结果存储在xmlHttp.onreadystatechange中。在这种情况下,我们想让xmlHttp知道readyState更改后它必须做什么(我们称之为回调)。