xmlhttp.readyState返回2,即使xmlhttp.状态等于200

xmlhttp.readyState returns 2 even though xmlhttp.status equals 200

本文关键字:xmlhttp 状态 readyState 返回 即使      更新时间:2023-09-26

我通过ajax发送电子邮件联系php。Php脚本发送邮件成功,但ajax xmlhttp。readyState一直返回2,即使xmlhttp。状态为200

params = "name=" + name + "&email=" + email + "&message=" + message + "&telephone=" + telephone;
xmlhttp.open("POST", "contact.php", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.onreadystatechange = function(){
    if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
        if(xmlhttp.responseText == "fill_form"){
            note.innerHTML = "Please fill the required fields properly";
            return;
        }
        if(xmlhttp.responseText == "Sent"){
            serverMessage.innerHTML = "Thanks. If it is a request or complaint we well get back to you soon";
        }
    }
    else{
        serverMessage.innerHTML = "Some internal error occured while sending the email. Please try again later";
        $('#myModal').modal('show')
    }
    submitBtn.innerHTML = "SEND MESSAGE";
    submitBtn.disabled = false;
}

Contact.php

<?php
$name=$_POST['name'];
$email=$_POST['email'];
$message=$_POST['message'];
$telephone=$_POST['telephone'];
$mail_to_send_to = "abc@gmail.com";
$feed_back_mail = "name@myDomainName.com";
if (empty($name) || empty($email)|| empty($message))
{
    echo "fill_form";
}
else{
    $from="From:$feed_back_mail"."'r'n"."Reply-To:$email"."'r'n" ;
    $subject="Users feed back Contact";
    if(empty($telephone)){
        $telephone = "No telephone sent my user";    
    }
    $message = "Telephone: $telephone'r'nSender's Email : $email 'r'n 'r'n$message 'r'n";
$isSent = mail($mail_to_send_to, $subject, $message, $from);
    if($isSent){
        echo $isSent;
    }
    else{
        echo "not_sent";
    }
}

?>

我做错了什么?

请记住,随着就绪状态的变化,您的onreadystatechange回调将被多次调用。您当前的代码响应第一个回调,期望它完成。但是对于您来说,在之前得到一个呼叫是很正常的,其中包含readyState 2 ("headers received")。

所以只要等到你得到readyState 4:

xmlhttp.onreadystatechange = function(){
    if(xmlhttp.readyState == 4){
        // Done, what happened?
        if(xmlhttp.status == 200){
            // All good
        }
        else{
            // Something went wrong
        }
    }
};

xmlhttp.readyState保存XMLHttpRequest的状态

取值范围为0 ~ 4:

0: request not initialized 
1: server connection established
2: request received 
3: processing request 
4: request finished and response is ready

其中xmlhttp.status表示您刚刚发出的请求的状态码。

更多信息来自developer.mozilla.org

XMLHttpRequest。readyState属性返回XMLHttpRequest客户端的状态。

0   UNSENT              Client has been created. open() not called yet.
1   OPENED              open() has been called.
2   HEADERS_RECEIVED    send() has been called, and headers and status are available.
3   LOADING             Downloading; responseText holds partial data.
4   DONE                The operation is complete.

2表示已经调用send()并且已经收到响应头。

4表示读取操作完成。这可能意味着数据传输已经成功完成,也可能失败。

所以你应该总是等待readyState 4

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState