首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >readyState不会更改为4

readyState不会更改为4
EN

Stack Overflow用户
提问于 2015-07-13 14:10:06
回答 1查看 519关注 0票数 1

我正在制作一个聊天application.In聊天应用程序,有“发送”按钮,点击它调用这个javascript函数。

代码语言: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文件中运行。

代码语言:javascript
复制
    if($mode == 'SendAndRetrieveNew')
{
    $name = $_POST['name'];
    $message = $_POST['message'];
    //$id = $_POST['id'];

    if($name != '' && $message != '')
    {
        $chat->postMessages($name,$message);
    }
}

postMessages($name,$message);如下:

代码语言:javascript
复制
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()函数如下:

代码语言:javascript
复制
    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()的最后一个sendmessages(),它显示readyState的值从2,3变为,最后执行内部if。3次怎么叫函数?我知道评论中有答案,但我不明白。请帮帮忙。我是阿贾克斯的新手。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-13 14:15:08

这是不正确的:

代码语言:javascript
复制
    xmlHttpGetMessages.onreadystatechange = sendmessages();
                                                        ^^

()意味着Javascript正在执行您的sendmessages函数。该函数不返回任何内容,因此本质上是将onreadystatechange回调设置为null

应该是公正的

代码语言:javascript
复制
    xmlHttpGetMessages.onreadystatechange = sendmessages;
                                                        ^---note this

它指定函数本身,而不是其结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31385690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档