2

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

不知何故,当我使用 AJAX(如 $.post)访问 PHP 时,我不得不回显“true”或“false”,而不是返回 true/false。我现在看到情况并非如此,但是有人可以为我分解吗?

测试布尔值是否有问题?像这儿

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

那是问题案例,对吗?在这里我不能返回真/假,而是必须回显一个字符串并测试该字符串,是吗?

if(response === "true")

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

还是我还在迷茫?

编辑

只是想感谢大家对此的良好回答。我现在是+2 smrter。

4

4 回答 4

6

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

但是,如果您想继续使用状态码 200(很多人都这样做):

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

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

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

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

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

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

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

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

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

...并从中返回此文本:

{"success": true}

或者

{"success": false}

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

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

或者,您可以返回 a Content-Typeoftext/plain并使用

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

...但这是一种手动反序列化,您可以在其中获得基础设施来为您完成它。

于 2013-02-05T13:11:54.317 回答
4

您的脚本应该返回一个响应,该响应将转换为您的 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()还可以处理除常规之外的 HTTP 状态代码响应200 OK,例如:

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');
    }
});
于 2013-02-05T13:08:53.367 回答
3

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

于 2013-02-05T13:09:23.960 回答
3

一切都取决于您的服务器响应。如果您使用适当的 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") {…}
} …
于 2013-02-05T13:11:26.530 回答