По какой-то причине этот ajax-вызов, над которым я работаю, возвращает состояние ошибки в журнале консоли … Я не могу понять, почему, для меня все выглядит правильно!
AJAX:
$(document).ready( function() {
$('.load-more').click(function(e) {
e.preventDefault();
console.log('Starting AJAX');
var $this = $(this);
var load = $this.data('current-page') + 1;
var parent = $this.data('parent');
var properties = {
snippet: 'infiniteScroll',
limit: 3,
offset: 0,
parents: 22,
depth: 999,
sortby: 'publishedon',
showHidden: 1,
debug: 1,
tpl: 'infiniteHomePageTpl',
};
$this.data('current-page', load);
$.ajax({
type: "POST",
url: "/ajax.processor",
data: properties,
cache: false,
dataType: "json",
success: function(response) {
if(response.status == 'success'){
console.log('Success');
}else if(response.status == 'error'){
console.log('data error');
}else{
console.log('some other error');
}
},
error: function(response){
console.log('an error has occurred' + response);
},
}); // ajax
});
});// document ready
Процессор называется:
<?php
// $modx->log(modX::LOG_LEVEL_ERROR,'Running ajax.processor, snippet = '.$_POST['snippet'].' formdata = '. print_r($_POST, TRUE));
$output = $modx->runSnippet($_POST['snippet'],array(
'snippet' => $_POST['snippet'],
'data' => $_POST
));
// set the header for the ajax call
$output = json_encode($output);
header('Content-type: application/json');
$modx->log(modX::LOG_LEVEL_ERROR,'Should be json = '.$output);
echo $output;
Код, который выполняет процессор:
<?php
//$modx->log(modX::LOG_LEVEL_ERROR, 'Running infinitescroll snippet' . print_r($scriptProperties, TRUE));
$output = array(
'status' => 'success',
'msg' => 'a message of some type',
'whatever' => 'this is some data',
);
return $output;
Строка регистрации в процессоре выведет json в журнал:
Should be json = {"status":"success","msg":"a message of some type","whatever":"this is some data"}
так что мой javascript ~ должен ~ возвращать json, но он не соответствует условию успеха, все, что я получаю в журнале консоли:
an error has occurred[object Object]
Что я здесь не так делаю?
Вам нужно json_encode для массива php, как уже прокомментировал Kaleb. http://php.net/manual/en/function.json-encode.php
Итак, ваш код должен быть:
//$modx->log(modX::LOG_LEVEL_ERROR, 'Running infinitescroll snippet' . print_r($scriptProperties, TRUE));
$output = array(
'status' => 'success',
'msg' => 'a message of some type',
'whatever' => 'this is some data',
);
$json = json_encode($output);
return $json;
Я бы также посоветовал вам использовать Firebug для мониторинга вашего javascript вместо записи сообщений консоли: http://getfirebug.com/
Попробуйте использовать HTTP-клиент, такой как Почтальон (или даже cURL), чтобы высмеять ваш вызов AJAX. Это облегчает проверку заголовков и содержимого ответа.
Кроме того, когда вызывается обработчик ошибок, первый аргумент всегда будет объектом XHR. Если вы делаете console.log(response);
(без приведения строки) вы должны быть в состоянии проверить его содержимое. Что может быть более полезным для вас, хотя два других параметра:
ошибка
Тип: Функция (jqXHR jqXHR, String textStatus, String
errorThrown)
Больше информации в документы jQuery.ajax.
Вам на самом деле нужен заголовок типа контента json а также закодировать вывод:
<?php
header('Content-Type: application/json');
//$modx->log(modX::LOG_LEVEL_ERROR, 'Running infinitescroll snippet' . print_r($scriptProperties, TRUE));
$output = array(
'status' => 'success',
'msg' => 'a message of some type',
'whatever' => 'this is some data',
);
echo json_encode($output);
И если вы хотите знать, почему это происходит, вы можете ожидать errorThrown
используя $.ajax.fail()
:
$.ajax({
type: "POST",
url: "/ajax.php",
data: properties,
cache: false,
dataType: "json",
success: function(response) {
//your code
},
error: function(response){
//your code
},
}).fail(function(jqXHR,textStatus,errorThrown) {
console.log(errorThrown);
});