Я как-то смутил себя.
Как-то я понял, что, столкнувшись с PHP с помощью AJAX (например, $ .post), вам нужно было повторить «истинный» или «ложный» вместо возврата true / false. Теперь я вижу, что это не так, но может ли кто-то сломать это для меня?
Разве это проблема с тестированием логического? Как здесь
... $.post('ajax/doThing',{data: data}, function(response) { if(response) { doThis(); }else{ doThat(); }
Это проблема, правильно? Здесь я не могу вернуть true / false, вместо этого я должен повторить строку и проверить строку, да?
if(response === "true")
Но я видел, что логические true / falses возвращаются в ajax-функции. Какая польза от этого, если вы не можете проверить логическое значение на стороне AJAX? И почему не может ajax проверить логическое?
Или я все еще смущен?
РЕДАКТИРОВАТЬ
Просто хотел поблагодарить всех за их хорошие ответы на это. Я теперь +2 smrter.
Вы также можете просмотреть возвращаемые коды ошибок HTTP, а не возвращать ответ «успех» (код состояния HTTP 200), когда запрос не был действительно успешным, а затем использовать обратный вызов error
для обработки неуспешных запросов.
Но если вы хотите продолжать использовать код состояния 200 (и многие люди делают это):
Данные, передаваемые между клиентом и сервером, всегда являются текстовыми. Хитрость заключается в том, чтобы убедиться, что клиент и сервер согласны с тем, как клиент должен десериализовать текст (преобразовать его при получении). Обычно вы можете вернуть одну из четырех вещей:
HTML (если он будет заполнять элементы страницы)
JSON (если вам нужен легкий и быстрый способ отправки данных клиенту)
XML (если вам нужен более тяжелый, быстрый способ отправки данных клиенту)
Обычный текст (по-вашему, на самом деле)
То, что клиент делает, будет зависеть от того, какой заголовок 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 }
Кроме того, вы можете вернуть Content-Type
text/plain
и использовать
if (response === "true") { // It was true } else { // It was false }
… но это своего рода десериализация рук, где вы могли бы получить инфраструктуру, чтобы сделать это за вас.
Ваш сценарий должен либо вернуть ответ, который переводится как эквивалент JavaScript ваших PHP-переменных, чтобы сделать такие сравнения возможными, либо использовать коды состояния 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'); } });
Все зависит от вашего ответа сервера. Если вы используете соответствующие типы 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") {…} } …
Ajax вызывает ожидание текста, возвращаемого вашими сценариями, когда вы возвращаете php bool, он не будет выводиться, поэтому вам нужно эхо «что-то», и его не обязательно должно быть «true» или «false»,