Надеюсь, это достаточно ясно, я потратил много энергии, пытаясь решить эту проблему, поэтому у меня может не хватить времени на написание идеального вопроса. Кроме того, это, возможно, придется включить в отчет об ошибках jQuery, но я бы лучше сначала опубликовал его здесь, поскольку я новичок в JavaScript, так что, возможно, я сделал что-то не так ...
Я создал следующий фрагмент кода, чтобы воспроизвести его. Он использует PHP для вывода полученных данных в браузер, хотя может работать без PHP.
Проблема может быть воспроизведена в Firefox 4 и Chrome 10. Вам понадобится консоль, чтобы увидеть, что происходит.
Вот код:
<code><?
$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...
При загрузке выдает некоторую явно не связанную ошибку или исключение при разборе (в зависимости от браузера). JSON, который должен быть отправлен, это {"что-то": "??"}, но если вы проверите его на вкладке сети 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"}