Непонятное поведение jQuery $ .ajax (), когда данные содержат последовательные вопросительные знаки

Я надеюсь, что это достаточно ясно, я потратил много времени, пытаясь решить эту проблему, поэтому у меня, возможно, не так много осталось, чтобы написать идеальный вопрос . Кроме того, это, возможно, должно быть включено в отчет об ошибке 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"}
28
задан Rolf 22 July 2019 в 10:34
поделиться

4 ответа

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)

Надеется, что это спасет кого-то еще от часов отладки ...

25
ответ дан 28 November 2019 в 03:27
поделиться

У меня была такая же проблема. Экранирование значений с помощью encodeURIComponent сделало свою работу!

1
ответ дан 28 November 2019 в 03:27
поделиться

Это звучит как проблема кодирования. Если ваши данные не в формате UTF-8 (например, MS Word или что-то еще), это может произойти.

1
ответ дан 28 November 2019 в 03:27
поделиться

Я столкнулся с той же проблемой. Указание «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) {

    }
});
1
ответ дан 28 November 2019 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: