readyState没有更改为4

readyState is not changing to 4

本文关键字:readyState      更新时间:2023-09-26

我正在制作一个聊天应用程序。在聊天应用程序中,有一个"发送"按钮,点击后调用这个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);
    }
}

这里变量xmlHttpGetMessagesXMLHttpRequest的对象。"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函数。这个函数没有返回任何东西,所以本质上你把onreadystatechange回调设置为null

应该是

    xmlHttpGetMessages.onreadystatechange = sendmessages;
                                                        ^---note this