jQuery는 동기 XMLHTTPRequest를 더 이상 사용하지 않습니다.


119

다른 많은 웹 사이트와 마찬가지로 내 웹 사이트는 jQuery를 사용하고 있습니다. 개발자 도구를 열면 XMLHTTPRequest가

최종 사용자의 경험에 해로운 영향을 미치기 때문에 더 이상 사용되지 않습니다.

계속해서 문서의 일부를 읽었 지만 상당히 기술적이었습니다. 누군가가 XMLHTTPRequest에서 WHATWG로 전환 한 결과를 간단한 용어로 설명 할 수 있습니까? 2012 년에 일어났다 고합니다.

또한 문서에 따르면 작업자 외부의 Synchronous XMLHttpRequest가 웹 플랫폼에서 제거되는 과정에 있다고합니다.이 경우 사용자 에이전트가 서비스에 포함 된 경우 기존 코드를 수정해야합니까?


2
비동기 XMLHTTPRequest가 아닌 동기 XMLHTTPRequest에 대해 이야기해야합니다. 맞습니까? 동기 요청은 최종 사용자 경험에 끔찍하며 (요청 중에 브라우저를 잠급니다) 일반적으로 사용해서는 안됩니다.
jfriend00 2015 년

2
이를 트리거하는 코드를 제공하십시오
charlietfl

3
문제의 전체 텍스트입니까? 기본 스레드의 동기 XMLHttpRequest는 최종 사용자의 경험에 해로운 영향을 미치기 때문에 더 이상 사용되지 않습니다.
Qantas 94 Heavy

1
jQuery는 동기 요청에 대해서만 경고를 제공합니다. 의도적으로 동기 요청을하고 있습니까? 그렇다면 해결책은 비동기 요청과 함께 작동하도록 코드를 구조화하는 것입니다. 사용자의 관점에서 보면 훨씬 더 좋기 때문에 어쨌든해야합니다.
nnnnnn

1
나는 내 웹 사이트에서 그 깃발을 보았을뿐만 아니라 다른 것, 예를 들어 Youtube도 보았다. 사양과 관련하여 내 코드가 W3C 또는 WHATWG를 준수해야하는 사양은 무엇입니까? , 참조 내가 생각하는 의견의 문제로 플래그가 지정 될 것이기 때문에 메인 스레드에서 묻고 싶지 않습니다. @ Qantas94Heavy
EDD

답변:


136

이 경고를 피하려면 다음을 사용하지 마십시오.

async: false

당신의 $.ajax()전화에서. 이것은 XMLHttpRequest더 이상 사용되지 않는 유일한 기능입니다 .

기본값은 async: true이므로이 옵션을 전혀 사용하지 않는 경우 기능이 실제로 제거 되어도 코드는 안전해야합니다.

그러나 아마도 그렇지 않을 것입니다. 표준에서 제거 될 수 있지만 브라우저는 수년 동안 계속해서 지원할 것입니다. 따라서 어떤 이유로 동기 AJAX가 정말로 필요한 경우 async: false경고를 사용 하고 무시할 수 있습니다 . 그러나 동기식 AJAX가 좋지 않은 스타일로 간주되는 이유가 있으므로이를 피할 방법을 찾아야 할 것입니다. 그리고 Flash 애플리케이션을 작성한 사람들은 아마도 그것이 사라질 것이라고 생각하지 않았을 것입니다.하지만 지금은 단계적으로 제거되고 있습니다.

Fetch대체 하는 API XMLHttpRequest는 동기식 옵션도 제공하지 않습니다.


9
이것은 jQuery의 경고입니다. 무시해도 되나요? 서버에 대한 동기 호출을 사용하지 않습니다. 내 완벽 주의자는 경고를 아예 싫어한다.
Jordan

2
@Jordan 경고는 jQuery가 아닌 브라우저에서 오는 것 같습니다. 동기식 AJAX를 사용하려고 할 때마다 발생합니다. jQuery를 사용하는 경우 해당 옵션을 $.ajax.
Barmar

2
나는 사용하고 jquery.i18n.properties.js있지만 $.ajax.내측에서 아마도 내부적 으로 명시적인 호출이 없지만 확실하지 않습니다.
마누엘 요르단

1
이 플러그인은 .properties파일 에서 리소스 번들을로드 합니다. 아마도 동기식 AJAX를 사용하여이 경고를 발생 시켰을 것입니다.
Barmar

1
@ManuelJordan 설정 async : i18n에서 true는 느린 연결에서 페이지에 표시된 문자열을 표시하는 데 지연이 발생할 수 있습니다. 대신 문자열 코드에 나와 서
Siyon DP

62

허용되는 대답은 정확하지만 Visual Studio 2013 이상을 사용하여 ASP.NET에서 개발하고 동기식 ajax 요청을 만들지 않았거나 잘못된 위치에 스크립트를 정의하지 않은 경우 다른 원인을 찾았습니다.

해결책은 시계 방향을 가리키는 작은 새로 고침 아이콘으로 표시된 VS 도구 모음 드롭 다운에서 "브라우저 링크 활성화"를 선택 취소하여 "브라우저 링크"기능을 비활성화하는 것입니다. 이 작업을 수행하고 페이지를 새로 고침하면 경고가 중지됩니다!

브라우저 링크 비활성화

이것은 로컬에서 디버깅하는 동안에 만 발생해야하지만 경고의 원인을 아는 것은 여전히 ​​좋습니다.


여기에 설명 된대로 내부 를 web.config추가하여 비활성화 할 수 있습니다 : poconosystems.com/software-development/… . <add key="vs:EnableBrowserLink" value="false" /><appSettings>
Beel

3
나는 이것이 콘솔에서 경고 메시지를 타는 것에 대한 나쁜 제안이라고 생각합니다. browserlink를 비활성화하고 browserlink가 추가하는 생산성 향상을 제거하여 브라우저 콘솔에 경고 메시지가 표시되지 않도록 하시겠습니까? Microsoft에 버그를 신고하는 것이 더 좋으며 수정됩니다.
coding4fun

4
@ coding4fun 귀하의 의견에 감사드립니다. Microsoft에 버그를 신고 할 수 있습니다. 브라우저 링크를 비활성화해야한다고 말한 것이 아닙니다. 내 대답은 경우에 따라이 경고의 원인에 대해 정확하며 자신의 코드에서 무언가를 배제하는 것이 유용합니다. 나는 그것이 내가 잘못한 것이 아니라는 것을 깨닫고 다른 사람들도 도움이 될 것이라고 생각했을 때 개인적으로 기분이 좋아졌습니다.
Sam

이것은 ajax 경고 이상을 수정했습니다. ASP 코어를 사용하는 자바 스크립트 콘솔에서 모든 종류의 브라우저 링크 엉망이 생겼습니다.
JoeBass

누구든지 브라우저 링크가 무엇인지 알고 있으며 왜 그런 경고를 표시하게 될까요?
기드온

15

이것은 본문 섹션이 끝나기 직전에 머리 외부의 외부 js에 대한 링크를 가지고 나에게 일어났습니다. 다음 중 하나입니다.

<script src="http://somesite.net/js/somefile.js">

JQuery와 관련이 없습니다.

아마도 다음과 같이 동일한 것을 볼 수 있습니다.

var script = $("<script></script>");
script.attr("src", basepath + "someotherfile.js");
$(document.body).append(script);

그러나 나는 그 아이디어를 테스트하지 않았습니다.


어차피 사용하지 않는 다음과 같은 줄을 제거했을 때 경고가 사라졌습니다. @ Html.Script ( "~ / scripts / apps / appname.js")
MsTapp

10

@ henri-chan 의 댓글로 언급 되었지만 더 많은 관심이 필요하다고 생각합니다.

jQuery / javascript를 사용하여 새 html로 요소의 내용을 업데이트하고이 새 html에 <script>태그 가 포함되어 있으면 태그가 동 기적 으로 실행 되어이 오류가 발생합니다. 스타일 시트도 마찬가지입니다.

XHR콘솔 창에서와 같이 (여러) 스크립트 또는 스타일 시트가로드되는 것을 볼 때 이런 일이 발생한다는 것을 알고 있습니다. (firefox).


3

이전 답변 중 어느 것도 내 상황에 적합하지 않았습니다. async매개 변수를 사용 jQuery.ajax()하지 않고 다음과 같이 반환되는 콘텐츠의 일부로 스크립트 태그를 포함하지 않습니다.

<div> 
     SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script> 

내 상황은 두 개의 div를 동시에 업데이트하기 위해 두 개의 AJAX 요청을 연속적으로 호출하고 있다는 것입니다.

function f1() {
     $.ajax(...); // XMLHTTP request to url_1 and append result to div_1
}

function f2() {
     $.ajax(...); // XMLHTTP request to url_2 and append result to div_2
}

function anchor_f1(){
$('a.anchor1').click(function(){
     f1();
})
}

function anchor_f2(){
$('a.anchor2').click(function(){
     f2();
});
}

// the listener of anchor 3 the source of problem
function anchor_problem(){
$('a.anchor3').click(function(){
     f1();
     f2();
});
}

anchor_f1();
anchor_f2();
anchor_problem();

를 클릭 a.anchor3하면 경고 플래그가 발생 click()합니다. 함수로 호출하는 f2를 대체하여 문제를 해결했습니다 .

function anchor_problem(){
$('a.anchor_problem').click(function(){
     f1();
     $('a.anchor_f2').click();
});
}

5
innerHTML을 통해 DOM에 직접 삽입하면 스크립트가 실행되지 않습니다. 따라서 .html ()을 호출하면 jQuery는 html 응답에 포함 된 모든 스크립트를 동 기적으로 가져와 실행합니다.
Henry Chan

@HenryChan, 나는 당신을 이해하려고 노력했지만 소용이 없었습니다. 더 간단한 말로 설명해 주시겠습니까? DOM에 스크립트를 삽입하지 않고 HTML 만 삽입하지만 여전히이 솔루션이 저에게 유일한 솔루션입니다. 미리 감사드립니다
Adib Aroui

2
@whitelettersinblankpapers 그가 의미한다고 생각합니다. ajax 콜백 내부에서 "div"에 추가하는 내용에 스크립트 태그가 포함되어 있으면 동 기적으로 호출됩니다.
Haitham Sweilem

1

내 작업 : 코드를 버퍼에 덤프하는 비동기 요청을 사용합니다. 매초마다 버퍼를 확인하는 루프가 있습니다. 덤프가 버퍼에 도착하면 코드를 실행합니다. 시간 제한도 사용합니다. 최종 사용자의 경우 페이지는 동기식 요청이 사용되는 것처럼 작동합니다.


이것을 달성하는 방법을 알기 위해 약간의 코드가 있습니까?
ZerOne 2015 년

5
@runback, done () promise 콜백을 사용할 수 없습니까? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) 내가 아무것도 잘못 읽지 않았기를 바랍니다.
pravin

0

부분보기에서 스크립트를로드하면이 문제가

  1. 부분보기에서 스크립트를 제거하고 기본보기로 이동했습니다.

이 솔루션은 나를 위해 잘 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.