Я надеюсь, что это достаточно ясно, я потратил много времени, пытаясь решить эту проблему, поэтому у меня, возможно, не так много осталось, чтобы написать идеальный вопрос . Кроме того, это, возможно, должно быть включено в отчет об ошибке jQuery, но я лучше сначала опубликую его здесь, так как я относительный новичок в JavaScript, так что, возможно, я сделал что-то не так ...
Я создал следующий фрагмент кода воспроизвести это. Он использует PHP для вывода полученных данных в браузер, хотя может работать и без PHP.
Проблема может быть воспроизведена в Firefox 4 и Chrome 10. Вам понадобится консоль, чтобы увидеть, что происходит.
Вот код:
<?
$input = file_get_contents('php://input');
if (isset($input) and !empty($input)) {
echo $input;
die();
}
?>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script>
$(function(){
var jsonData = {
"something":"??"
};
jsonData = JSON.stringify(jsonData);
var onSuccess = function(data){
console.log("Ajax Success!");
console.log(data);
}
var onError = function(jqXHR, textStatus, errorThrown){
console.log("Ajax Error: "+textStatus);
console.log("More info:");
console.log(errorThrown);
console.log(jqXHR);
}
console.log("Now sending this: "+jsonData+" through Ajax...");
var ajaxCmd = {
"url" : "test.php",
"dataType": "json",
"type" : "POST",
"async" : false,
"error" : onError,
"success" : onSuccess,
"data" : jsonData
};
$.ajax(ajaxCmd);
});
</script>
</head>
<body>
<pre>Check your JavaScript console...</pre>
</body>
</html>
При загрузке выдает некоторую явно несвязанную ошибку синтаксического анализа или исключение (в зависимости от браузера). Необходимо отправить json-файл {"something": "??"}, но если вы проверите его на вкладке сети в Firebug (или его эквиваленте в Chrome), вы увидите это "??" заменяется некоторой строкой jQuery, которая выглядит так:
<?
$input = file_get_contents('php://input');
if (isset($input) and !empty($input)) {
echo $input;
die();
}
?>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script>
$(function(){
var jsonData = {
"something":"??"
};
jsonData = JSON.stringify(jsonData);
var onSuccess = function(data){
console.log("Ajax Success!");
console.log(data);
}
var onError = function(jqXHR, textStatus, errorThrown){
console.log("Ajax Error: "+textStatus);
console.log("More info:");
console.log(errorThrown);
console.log(jqXHR);
}
console.log("Now sending this: "+jsonData+" through Ajax...");
var ajaxCmd = {
"url" : "test.php",
"dataType": "json",
"type" : "POST",
"async" : false,
"error" : onError,
"success" : onSuccess,
"data" : jsonData
};
$.ajax(ajaxCmd);
});
</script>
</head>
<body>
<pre>Check your JavaScript console...</pre>
</body>
</html>
При загрузке выдает некоторую явно не связанную ошибку синтаксического анализа или исключение (в зависимости от браузера). Необходимо отправить json-файл {"something": "??"}, но если вы проверите его на вкладке сети в Firebug (или его эквиваленте в Chrome), вы увидите это "??" заменяется некоторой строкой jQuery, которая выглядит так:
<?
$input = file_get_contents('php://input');
if (isset($input) and !empty($input)) {
echo $input;
die();
}
?>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script>
$(function(){
var jsonData = {
"something":"??"
};
jsonData = JSON.stringify(jsonData);
var onSuccess = function(data){
console.log("Ajax Success!");
console.log(data);
}
var onError = function(jqXHR, textStatus, errorThrown){
console.log("Ajax Error: "+textStatus);
console.log("More info:");
console.log(errorThrown);
console.log(jqXHR);
}
console.log("Now sending this: "+jsonData+" through Ajax...");
var ajaxCmd = {
"url" : "test.php",
"dataType": "json",
"type" : "POST",
"async" : false,
"error" : onError,
"success" : onSuccess,
"data" : jsonData
};
$.ajax(ajaxCmd);
});
</script>
</head>
<body>
<pre>Check your JavaScript console...</pre>
</body>
</html>
При загрузке выдает некоторую явно не связанную ошибку синтаксического анализа или исключение (в зависимости от браузера). Необходимо отправить json-файл {"something": "??"}, но если вы проверите его на вкладке сети в Firebug (или его эквиваленте в Chrome), вы увидите это "??" заменяется некоторой строкой jQuery, которая выглядит так: jQuery152026845051744021475_1303152126170
И это то, что получает сервер.
Эта проблема возникает только тогда, когда в поле значения отправленного объекта JSON есть два или более последовательных вопросительных знака, даже если там есть другие буквы. С одним вопросительным знаком вроде работает. Также изменение "dataType" на "text" исправляет это. Но мне нужны все эти функции!
Если вы закомментируете "jsonData = JSON.stringify (jsonData);" или "$ .ajax (ajaxCmd);" ошибки также чудесным образом исчезают.
Дополнительная информация:
Вывод консоли Chrome:
test.php:21Now sending this: {"something":"??"} through Ajax...
jquery.min.js:16Uncaught SyntaxError: Unexpected token :
test.php:16Ajax Error: parsererror
test.php:17More info:
test.php:18jQuery15206220591682940722_1303153398797 was not called
test.php:19
Object
Вывод Firefox Firebug:
Now sending this: {"something":"??"} through Ajax...
Ajax Error: parsererror
More info:
jQuery15206494160738701454_1303153492631 was not called
Object { readyState=4, responseText="{"something":"jQuery152...8701454_1303153492631"}", more...}
invalid label
{"something":"jQuery15206494160738701454_1303153492631"}
jQuery использует ??
в качестве заполнителя для функции обратного вызова при использовании jsonp
. Когда он анализирует Ajax-запрос и находит двойной вопросительный знак (или несколько вопросительных знаков), он автоматически предполагает, что вы пытаетесь использовать jsonp
. Когда вы устанавливаете тип содержимого вручную, он игнорирует вопросительные знаки.
Итак, избегайте проблемы, используя contentType:
$.ajax(
url: "your-url.php",
dataType: "json", // what you expect the server to return
contentType: "application/json", // what you are sending
...
);
Для справки:
jQuery Bugtracker: $ .AJAX ИЗМЕНИЛ СОДЕРЖАНИЕ ПОЧТЫ, ЕСЛИ ВКЛЮЧАЯ «??» (2 QUESTION MARK)
Надеется, что это спасет кого-то еще от часов отладки ...
У меня была такая же проблема. Экранирование значений с помощью encodeURIComponent
сделало свою работу!
Это звучит как проблема кодирования. Если ваши данные не в формате UTF-8 (например, MS Word или что-то еще), это может произойти.
Я столкнулся с той же проблемой. Указание «contentType»: «application / json; charset = utf-8» решает эту проблему.
jQuery.ajax({
"url": url,
"data": JSON.stringify(payload),
"type": "POST",
"dataType": "json",
"contentType":"application/json; charset=utf-8",
"success": function(data) {
},
"error": function(jqXHR, textStatus, errorThrown) {
}
});