readyState 未更改为 4
readyState is not changing to 4
我正在制作聊天 application.In 聊天应用程序,有 "Send" 按钮,点击它会调用此 javascript 函数。
function sendmessage()
{
var message = document.getElementById('messageBox');
var currentuser = document.getElementById('username').value;
if(trim(message.value) != '' && trim(currentuser) != '')
{
params = "mode=SendAndRetrieveNew"+
"&name="+encodeURIComponent(currentuser)+
"&message="+encodeURIComponent(message.value);
message.value="";
xmlHttpGetMessages.open("POST",chaturl,true);
xmlHttpGetMessages.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttpGetMessages.onreadystatechange = sendmessages();
xmlHttpGetMessages.send(params);
}
}
这里变量xmlHttpGetMessages
是XMLHttpRequest
的一个对象。 chaturl
变量包含 php 文件的名称。以下代码段在该 php 文件中运行。
if($mode == 'SendAndRetrieveNew')
{
$name = $_POST['name'];
$message = $_POST['message'];
//$id = $_POST['id'];
if($name != '' && $message != '')
{
$chat->postMessages($name,$message);
}
}
postMessages($name,$message);
如下:
public function postMessages($name, $message)
{
$name = $this->Mysqli->real_escape_string($name);
$message = $this->Mysqli->real_escape_string($message);
$query = 'INSERT INTO chat(posted_on, user_name, message) VALUES ( NOW(), " ' . $name . ' " , " '. $message .' " )';
$result = $this->Mysqli->query($query);
}
sendmessages()
函数如下:
function sendmessages()
{
if(xmlHttpGetMessages.readyState == 4)
{
if(xmlHttpGetMessages.status = 200 || xmlHttpGetMessages.status == 304)
alert("Send the message.Check database");
else
alert("In else of inner IF");
}
else
alert("In else of outer IF "+xmlHttpGetMessages.readyState);
}
readyState
值仅从 0 变为 1,从上一个 alert();
可以看出这一点。
如何使它的值变为 4.
阅读第一个答案后,我将 xmlHttpGetMessages.onreadystatechange = sendmessages();
更改为 xmlHttpGetMessages.onreadystatechange = sendmessages
并且成功了。但是 sendmessages()
中的最后一个 alert()
最初执行,它显示 readyState 的值从 2,3 变化,最后执行内部 if
。函数如何被调用 3 次?
我知道评论中有答案,但我不明白。请帮助。我是 Ajax.
的新手
这是不正确的:
xmlHttpGetMessages.onreadystatechange = sendmessages();
^^
()
表示 Javascript 正在执行您的 sendmessages
函数。该函数 returns 什么都没有,所以基本上您将 onreadystatechange
回调设置为 null
.
应该只是
xmlHttpGetMessages.onreadystatechange = sendmessages;
^---note this
它分配的是 FUNCTION ITSELF,而不是它的结果。
我正在制作聊天 application.In 聊天应用程序,有 "Send" 按钮,点击它会调用此 javascript 函数。
function sendmessage()
{
var message = document.getElementById('messageBox');
var currentuser = document.getElementById('username').value;
if(trim(message.value) != '' && trim(currentuser) != '')
{
params = "mode=SendAndRetrieveNew"+
"&name="+encodeURIComponent(currentuser)+
"&message="+encodeURIComponent(message.value);
message.value="";
xmlHttpGetMessages.open("POST",chaturl,true);
xmlHttpGetMessages.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttpGetMessages.onreadystatechange = sendmessages();
xmlHttpGetMessages.send(params);
}
}
这里变量xmlHttpGetMessages
是XMLHttpRequest
的一个对象。 chaturl
变量包含 php 文件的名称。以下代码段在该 php 文件中运行。
if($mode == 'SendAndRetrieveNew')
{
$name = $_POST['name'];
$message = $_POST['message'];
//$id = $_POST['id'];
if($name != '' && $message != '')
{
$chat->postMessages($name,$message);
}
}
postMessages($name,$message);
如下:
public function postMessages($name, $message)
{
$name = $this->Mysqli->real_escape_string($name);
$message = $this->Mysqli->real_escape_string($message);
$query = 'INSERT INTO chat(posted_on, user_name, message) VALUES ( NOW(), " ' . $name . ' " , " '. $message .' " )';
$result = $this->Mysqli->query($query);
}
sendmessages()
函数如下:
function sendmessages()
{
if(xmlHttpGetMessages.readyState == 4)
{
if(xmlHttpGetMessages.status = 200 || xmlHttpGetMessages.status == 304)
alert("Send the message.Check database");
else
alert("In else of inner IF");
}
else
alert("In else of outer IF "+xmlHttpGetMessages.readyState);
}
readyState
值仅从 0 变为 1,从上一个 alert();
可以看出这一点。
如何使它的值变为 4.
阅读第一个答案后,我将 xmlHttpGetMessages.onreadystatechange = sendmessages();
更改为 xmlHttpGetMessages.onreadystatechange = sendmessages
并且成功了。但是 sendmessages()
中的最后一个 alert()
最初执行,它显示 readyState 的值从 2,3 变化,最后执行内部 if
。函数如何被调用 3 次?
我知道评论中有答案,但我不明白。请帮助。我是 Ajax.
这是不正确的:
xmlHttpGetMessages.onreadystatechange = sendmessages();
^^
()
表示 Javascript 正在执行您的 sendmessages
函数。该函数 returns 什么都没有,所以基本上您将 onreadystatechange
回调设置为 null
.
应该只是
xmlHttpGetMessages.onreadystatechange = sendmessages;
^---note this
它分配的是 FUNCTION ITSELF,而不是它的结果。