Webkit (Chrome / Safari) только ошибка ответа AJAX

Я возвращаю JSON из запроса AJAX в простой скрипт PHP. Все отлично работает с IE & Firefox, но Chrome не любит ответ вообще. По сути, я возвращаю JSON в случае успеха, но это сопровождается ошибкой, поэтому скрипт завершается ошибкой.

JQuery довольно прямолинейный (я удалил большую часть обратного вызова, так как он не имеет отношения к проблеме — скрипт завершается неудачей с ним или без него):

$.ajax({
type: 'GET',
headers: {'cache-control': 'no-cache'},
cache: false,
url: 'ajax/request.php',
dataType: 'json',
success: function(a){
$.each(a, function(b, c){
var d = $.map(c, function(e){
return e;
});

-- do stuff with results --

});
},
error: function(a, b, c){
console.log(a);
console.log(b);
console.log(c);
}
});

Сценарий PHP выглядит примерно так (у меня есть объект, который выполняет очень простой запрос, а результаты кодируются в формате JSON):

$gallery = new gallery;
$gallery_json = $gallery->select_all($number);
echo json_encode($gallery_json);

Консоль (только с webkit) показывает «readyState: 4» и «status: 200» и т. Д. И продолжает следующие ошибки:

parsererror

SyntaxError: Unexpected end of input {stack: "SyntaxError: Unexpected end of input↵    at Object…om/ajax/libs/jquery/1.11.1/jquery.min.js:4:25897)", message: "Unexpected end of input"}
message: "Unexpected end of input"stack: "SyntaxError: Unexpected end of input↵    at Object.parse (native)↵    at m.parseJSON (http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js:4:15739)↵    at Pc (http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js:4:18120)↵    at x (http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js:4:21525)↵    at XMLHttpRequest.m.ajaxTransport.send.b (http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js:4:25897)"get stack: function () { [native code] }
arguments: null
caller: null
length: 0
name: ""prototype: StackTraceGetter
__proto__: function Empty() {}
<function scope>
set stack: function () { [native code] }
arguments: null
caller: null
length: 1
name: ""prototype: StackTraceSetter
__proto__: function Empty() {}
<function scope>
__proto__: Error
constructor: function SyntaxError() { [native code] }
name: "SyntaxError"stack: undefined
get stack: function () { [native code] }
arguments: null
caller: null
length: 0
name: ""prototype: StackTraceGetter
__proto__: function Empty() {}
<function scope>
set stack: function () { [native code] }
arguments: null
caller: null
length: 1
name: ""prototype: StackTraceSetter
__proto__: function Empty() {}
<function scope>
__proto__: d

(Извиняюсь за перепутанный интервал)

JSON корректно возвращается с другими браузерами, поэтому я уверен, что нет проблем с самим запросом и об ошибках PHP не сообщается. Кроме того, если попытаться получить доступ к некоторому содержимому возвращенного JSON (например, предупредить некоторую часть «var d», как в «alert (d [2]);» где-то в обратном вызове успеха), то я могу видеть что я на самом деле получаю ожидаемую информацию.

Я попытался изменить параметры json_encode, добавить JSON_HEX_QUOTES и т. Д., Но безуспешно. Я также попытался добавить информацию в таблицу SQL, чтобы не возвращать никаких результатов, содержащих «ноль». Опять не повезло. Так что я застрял — поскольку ошибка появляется только в консоли webkit, я могу только предположить, что она очень точна в отношении ожидаемого формата JSON или чего-то еще, но я не знаю. И поскольку я использовал подобный процесс в другом месте моего приложения без ошибок, мне трудно определить, почему этот экземпляр вызывает эту ошибку.

Спасибо заранее.

0

Решение

In most cases your JavaScript is broken in some way. For example missing a } or something like that.

Example given, this will yield "Unexpected end of input" too:

eval('[{"test": 10}') // notice the missing ]
But the root cause of the problems seems to be that the requested JSON url has a Content-Type of text/html which Chrome apparently tries to parse as HTML, which then results in the unexpected end of input due to the fact that the included image tags are being parsed.

Try setting the Content-Type to text/plain I think it should fix the issues.
0

Другие решения

Ну, я не уверен, будет ли это вообще кому-нибудь полезно, но, возможно, кто-то сможет объяснить эту странную причуду. Мне удалось решить мою проблему, но я все еще не совсем уверен в ее причине: в основном, несмотря на то, что мне удалось вернуть действительную страницу JSON в приложение из запроса PHP, по какой-то причине некоторая информация «$ _SESSION» вызывала что-то в JSON для выдачи ошибки разбора, когда он вернулся для использования в обратном вызове javascript. Когда я установил для dataType значение «text», все было в порядке, но как только я попробовал «$ .parseJSON», он сломал скрипт. Точно так же установка dataType на «json» вызовет ошибку, поэтому что-то в выводе JSON вызывает ошибку. Когда я вместо этого передавал информацию о нарушающем сеансе через запрос AJAX, как в «data: {foo: ‘bar’}», все работало идеально — те же данные, просто другой способ их получения.

Я не могу понять, почему только WebKit не нравится мой метод использования информации о сеансе таким образом — это не проблема для IE или Firefox — и почему только этот экземпляр работал таким образом (и да, я проверил, что информация о сеансе не была изменена или что-либо). Поэтому мне было бы интересно узнать, сталкивался ли кто-нибудь с таким странным поведением раньше.

0

По вопросам рекламы [email protected]