我什么时候应该向AJAX返回true/false;真“/";false”;


When should I return true/false to AJAX and when should I echo "true"/"false"

不知怎么的,我把自己弄糊涂了。

不知怎么的,我脑子里想,当用AJAX(比如$.post)访问PHP时,你必须回显一个"true"或"false",而不是返回true/false。我现在明白事实并非如此,但有人能帮我把它分解一下吗?

测试布尔值有问题吗?像这里

... 
$.post('ajax/doThing',{data: data},
    function(response) {
        if(response) {
            doThis();
        }else{
            doThat();
        }

这就是问题所在,对吗?在这里,我不能返回true/false,相反,我必须回显一个字符串并测试该字符串,是吗?

if(response === "true")

但是我已经看到布尔true/false返回到ajax函数。如果您不能在AJAX端测试布尔值,那么这有什么用?为什么ajax不能测试布尔值?

还是我仍然困惑?

编辑

我只是想感谢大家在这方面的良好回答。我现在是+2 smrter。

当请求不是真正成功时,您还可以考虑返回HTTP错误代码,而不是返回"成功"响应(HTTP状态代码200),然后使用error回调来处理不成功的请求。

但如果你想继续使用状态码200(很多人都这么做):

客户端和服务器之间传输的数据始终是文本。诀窍是确保客户端和服务器就客户端应如何反序列化文本(在收到文本时进行转换)达成一致。通常情况下,您可能会返回以下四种内容之一:

  1. HTML(如果要填充页面元素)

  2. JSON(如果您想要一种轻量级、快速的方式向客户端发送数据)

  3. XML(如果您想要更重、快速的方式将数据发送到客户端)

  4. 纯文本(无论你想要什么,真的)

客户端的操作将取决于您在PHP页面中使用的Content-Type标头。

我的猜测是,您使用的是几种内容类型中的任何一种,它们最终将数据作为字符串传递给回调。字符串"true"是真的,但字符串"false"也是真的(只有空字符串是假的)。

长话短说:我可能会在我的PHP中使用这个:

header('Content-Type', 'application/json');

以及从中返回此文本:

{"success": true}

{"success": false}

然后在你的成功处理程序中:

if (response.success) {
    // It was true
}
else {
    // It was false
}

或者,您可以返回text/plainContent-Type并使用

if (response === "true") {
    // It was true
}
else {
    // It was false
}

但这是一种手工反序列化,在那里你可以让基础设施为你做这件事。

您的脚本应该返回一个响应,该响应转换为与PHP变量等效的JavaScript,以使这种比较成为可能使用HTTP状态代码来传达错误条件。

响应处理

jQuery.ajax()和朋友们根据您发送的响应头来解释响应(默认情况下自动),无论是XML、JSON等。

以下代码输出JSON格式的响应:

header('Content-Type: application/json');
echo json_encode(array(
    'success' => true,
));

发送到浏览器的输出如下所示:

{"success": true}

在成功处理程序中,您现在可以使用以下代码:

if (response.success) { ... }

错误处理

jQuery.ajax()还可以处理除常规200 OK之外的HTTP状态码响应,例如:

header('404 Not found');
exit;

这将调用您的错误处理程序:

$.ajax({
    url: ...,
    error: function(xhr, status, msg) {
      // xhr - see http://api.jquery.com/jQuery.ajax/#jqXHR
      // status - "error"
      // msg - "Not found"
      alert('Error code ' + xhr.code + ' encountered');
    }
});

Ajax调用需要脚本返回的文本,当您返回php bool时,它不会被输出,所以您需要回显"something",它不必是"true"或"false"

这一切都取决于您的服务器响应。如果使用适当的MIME类型,jQuery可能会自动为您JSON.parse()响应,并将布尔值true传递给回调。如果它不识别JSON,它将传递需要与之进行比较的文本结果"true"


// PHP:
header('Content-Type', 'application/json');
echo true; // or "true" or json_encode(true)
// JavaScript (with jQuery.ajax):
… function callback(response) {
    typeof response; // "boolean"
    if (response) {…}
} …

// PHP:
header('Content-Type', 'text/plain'); // or similar, also implicit
echo "true";
// JavaScript (with jQuery.ajax):
… function callback(response) {
    typeof response; // "string"
    if (response == "true") {…}
} …