데이터에 연속되는 물음표가 포함되어 있는 경우 이해할 수 없는 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 문자열로 대체되었습니다.jQuery 152026845051744021475_1303152126170
이것이 서버가 수신하는 것입니다.
이 문제가 발생하는 것은 전송된 JSON 오브젝트 내의 값 필드에 다른 문자가 있는 경우에도 연속되는2개 이상의 물음표가 있는 경우뿐입니다.물음표 하나만 찍어도 효과가 있는 것 같습니다.또한 "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 사용??사용할 때 콜백 함수의 플레이스 홀더로서jsonpAjax 요청을 해석하고 이중 물음표(또는 더 많은 물음표)를 찾으면 자동으로 사용자가 사용하려고 하는 것으로 간주됩니다.jsonpcontent-type을 수동으로 설정하면 물음표는 무시됩니다.
그러니까 콘텐츠를 이용해서 문제를 피하세요.유형:
$.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 물음표)
몇 시간 동안 디버깅을 하지 않고 다른 사람을 구할 수 있기를 바랍니다.
"data" 값의 형식을 유효한 HTML 쿼리 문자열로 지정하지 않을 경우 미리 문자열을 지정하지 마십시오.말씀하신 것처럼 "JSON.stringify()"를 호출하지 않으면 동작합니다.도서관이 이미 널 위해 그 일을 처리해 줄 것을 알고 있기 때문이야.
여기서 JSON 문자열을 파라미터 자체로서 서버측 코드에 송신하는 경우는, 그것을 파라미터로서 설정할 필요가 있습니다.
$.ajax(url, {
// ...
data: { jsonParam: jsonData },
// ...
});
이제 서버에 "jsonParam"이라는 파라미터가 있는 HTTP 요구가 표시되며 그 값은 JSON 문자열이 됩니다.
당신이 찾고 있는 답은 AJAX 콜옵션에서 jsonp:false를 설정하는 것이라고 생각합니다.저는 똑같은 문제를 안고 그것을 해결했습니다.
자세한 내용은 이 유사한 질문에 대한 답변을 참조하십시오. jQuery 1.4에서 1.5로 업그레이드한 후 데이터가 재정의되었습니다.
기존 답변 중 이 내용이 언급되지 않았기 때문입니다.이 문제는 다음을 추가하여 해결할 수 있습니다.
jsonp: false
Ajax 요청 설정으로 이동합니다.
1.5.2에 그런 문제가 있어요.jQuery 버그입니다.http://bugs.jquery.com/ticket/84171.6.4로 업데이트하거나 다음과 같이 할 수 있습니다.jQuery 함수 "jQuery.ajaxPrefilter"가 변경되었습니다.
var dataIsString = ( typeof s.data === "string" );
타고
var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
( typeof s.data === "string" );
아래의 "if" 조건에서 이 변수를 다음과 같이 변경했습니다.
if ( s.dataTypes[ 0 ] === "jsonp" ||
originalSettings.jsonpCallback ||
originalSettings.jsonp != null ||
s.jsonp !== false && ( jsre.test( s.url ) ||
dataIsString && jsre.test( s.data ) ) ) {
inspectData && jsre.test( s.data ) ) ) {
jQuery 1.6.4에서 수정했습니다.
jQuery 1.71에서도 동일한 문제가 발생하며 이중 물음표가 표시되고 일부 미친 문자열이 삽입됩니다.
제거하여 수정할 수 있었다.
dataType: 'JSON'
마법처럼 작동을 멈췄어요
부호화의 문제인 것 같습니다.데이터가 UTF-8 형식(MS Word 등)이 아닌 경우 이 문제가 발생할 수 있습니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 의한 값 이스케이프encodeURIComponent★★★★★★★★★★★★★★★★★★!
저도 같은 문제에 직면했어요.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) {
}
});
언급URL : https://stackoverflow.com/questions/5707619/uncomprehensible-jquery-ajax-behavior-when-data-contains-consecutive-questio
'codememo' 카테고리의 다른 글
| 로드된 스프링 콩을 모두 인쇄합니다(스프링 부트). (0) | 2023.02.22 |
|---|---|
| 각도 $scope.안전한 $190 대 $190 (0) | 2023.02.22 |
| WordPress: get_the_content()와 the_content()의 차이 (0) | 2023.02.22 |
| Wordpress 플러그인: 커스텀 URL 핸들 추가 방법 (0) | 2023.02.22 |
| ng-click을 사용하여 두 가지 함수를 호출합니다. (0) | 2023.02.22 |