JQuery отказался от синхронного XMLHTTPRequest

Как и многие другие, мой сайт использует jQuery. Когда я открываю инструменты для разработчиков, я вижу предупреждение, в котором говорится, что XMLHTTPRequest

устарел из-за его пагубных последствий для конечного пользователя.

Я продолжил и прочитал часть документации, но он был довольно техническим. Может ли кто-нибудь объяснить последствия перехода от XMLHTTPRequest к WHATWG простыми словами? Он говорит, что это произошло в 2012 году.

Кроме того, в документации говорится, что синхронный XMLHttpRequest за пределами рабочих находится в процессе удаления с веб-платформы, когда это происходит, если агент пользователя имел их в службе, им нужно изменить свой существующий код?

Ответ 1

Чтобы избежать этого предупреждения, не используйте:

async: false

в любом из ваших $.ajax(). Это единственная особенность XMLHttpRequest которая устарела.

По умолчанию используется async: true, поэтому, если вы вообще никогда не используете эту опцию, ваш код должен быть безопасным, если эта функция когда-либо действительно удалена.

Однако, вероятно, этого не произойдет - его можно удалить из стандартов, но я уверен, что браузеры будут поддерживать его в течение многих лет. Так что если вам действительно нужен синхронный AJAX по какой-то причине, вы можете использовать async: false и просто игнорировать предупреждения. Но есть веские причины, по которым синхронный AJAX считается плохим стилем, поэтому вам, вероятно, следует попытаться найти способ его избежать. И люди, которые писали приложения для Flash, вероятно, никогда не думали, что это тоже исчезнет, но сейчас оно постепенно сокращается.

Обратите внимание, что Fetch API, который заменяет XMLHttpRequest, даже не предлагает синхронную опцию.

Ответ 2

Принятый ответ правильный, но я нашел другую причину, если вы разрабатываете в ASP.NET с Visual Studio 2013 или выше и уверены, что не делали никаких синхронных аякс-запросов или не определяли какие-либо скрипты в неположенном месте.

Решение состоит в том, чтобы отключить функцию "Браузерная ссылка", сняв флажок "Включить ссылку на браузер" в раскрывающемся списке панели инструментов VS, указанном маленьким значком обновления, указывающим по часовой стрелке. Как только вы это сделаете и перезагрузите страницу, предупреждения должны остановиться!

Отключить ссылку на браузер

Это должно произойти только при отладке локально, но все же приятно знать причину предупреждений.

Ответ 3

Это случилось со мной, если у вас есть ссылка на внешние js вне головы непосредственно перед концом секции тела. Вы знаете, один из них:

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

Это не имело никакого отношения к JQuery.

Вероятно, вы увидите то же самое, что и вы:

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

Но я не тестировал эту идею.

Ответ 4

Это было упомянуто как комментарий @henri-chan, но я думаю, что это заслуживает большего внимания:

Когда вы обновляете содержимое элемента с помощью нового html с использованием jQuery/javascript, и этот новый html содержит теги <script>, они выполняются синхронно и, таким образом, вызывают эту ошибку. То же самое касается таблиц стилей.

Вы знаете, что это происходит, когда вы видите (несколько) скриптов или таблиц стилей, загружаемых как XHR в окне консоли. (Fire Fox).

Ответ 5

Ни один из предыдущих ответов (все верно) не подходит для моей ситуации: я не использую параметр async в jQuery.ajax(), и я не включаю тег script как часть содержимое, которое возвращалось как:

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

Моя ситуация заключается в том, что я вызываю два запроса AJAX последовательно с целью одновременного обновления двух div:

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, он вызывает флаг предупреждения. Я решил проблему, заменив вызов f2 функцией click():

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

Ответ 6

Моя работа: я использую асинхронные запросы, сбрасывая код в буфер. У меня есть петля, проверяющая буфер каждую секунду. Когда дамп прибыл в буфер, я выполняю код. Я также использую тайм-аут. Для конечного пользователя страница работает так, как если бы использовались синхронные запросы.