jQuery застарів синхронний XMLHTTPRequest


119

Як і багато інших, мій веб-сайт використовує jQuery. Коли я відкриваю інструменти для розробників, я бачу попередження, яке говорить про те, що XMLHTTPRequest є

застаріла через згубний вплив на досвід кінцевого користувача.

Я пішов і прочитав частину документації , але це було досить технічно. Чи може хтось пояснити наслідки переходу від XMLHTTPRequest до WHATWG простими словами? У ньому сказано, що це сталося у 2012 році.

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


2
Ви повинні говорити про синхронні запити XMLHTTPRequests, а не асинхронні, правильно? Синхронні запити жахливі для кінцевого користувача (вони блокують браузер під час запиту) і, як правило, не повинні використовуватися.
jfriend00

2
наведіть код, який запускає це
charlietfl

3
Це повний текст, про який йдеться? Синхронний XMLHttpRequest в головному потоці застарілий через його згубний вплив на досвід кінцевого користувача.
Qantas 94 Важкий

1
jQuery видає це попередження лише для синхронних запитів, чи не так? Ти свідомо робиш синхронний запит? Якщо так, рішення полягає в тому, щоб сформулювати свій код для роботи з асинхронними запитами, що ви все одно повинні зробити, оскільки вони набагато приємніші з точки зору користувача.
nnnnnn

1
Я бачив цей прапор не тільки на своєму веб-сайті, я бачив його і деякі інші, наприклад, Youtube. Що стосується специфікацій, з якою специфікацією повинен відповідати мій код, W3C чи WHATWG? , посилання, я не хочу запитувати в основній темі, як це було б позначено як думку думки. @ Qantas94Heavy
Едд

Відповіді:


136

Щоб уникнути цього попередження, не використовуйте:

async: false

в будь-якому з ваших $.ajax()дзвінків. Це єдина функція, XMLHttpRequestяка застаріла.

За замовчуванням є async: true, тому якщо ви ніколи не користуєтесь цією опцією, ваш код повинен бути безпечним, якщо функція буде дійсно видалена.

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

Зауважте, Fetchщо замінює API XMLHttpRequestнавіть не пропонує синхронний параметр.


9
Це попередження jQuery тоді. Я можу це проігнорувати? Я не використовую синхронні дзвінки на сервер. Перфекціоністській стороні мене взагалі не подобається мати попередження.
Йорданія

2
@ Джордан Я думаю, що попередження надходить від браузера, а не jQuery. Це станеться кожного разу, коли ви намагатиметеся використовувати синхронний AJAX. Якщо ви використовуєте jQuery, це станеться лише в тому випадку, якщо ви вказали цей параметр $.ajax.
Бармар

2
Я використовую, jquery.i18n.properties.jsале немає явного заклику моєї сторони, $.ajax.можливо, внутрішньо, але не впевнений.
Мануель Йордан

1
Цей плагін завантажує пакети ресурсів з .propertiesфайлів. Можливо, для цього використовується синхронний AJAX, викликаючи це попередження.
Бармар

1
Налаштування @ManuelJordan async: true у i18n може спричинити затримку у відображенні рядків, що відображаються на вашій сторінці при повільному з'єднанні. Showin замість рядкового коду
Siyon DP

62

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

Рішення полягає в тому, щоб вимкнути функцію «Посилання браузера», знявши позначку «Увімкнути посилання браузера» у спадному меню панелі інструментів VS, вказаним маленьким значком оновлення, що вказує за годинниковою стрілкою. Як тільки ви це зробите і перезавантажите сторінку, попередження повинні припинитися!

Вимкнути посилання веб-переглядача

Це має відбуватися лише під час налагодження локально, але все-таки приємно знати причину попереджень.


Ви можете відключити web.configйого, додавши <add key="vs:EnableBrowserLink" value="false" />всередину, <appSettings>як описано тут: poconosystems.com/software-development/… .
Beel

3
Я думаю, що це погана пропозиція просто покататись попереджувальних повідомлень у консолі. Вимкнути посилання на браузер і позбутися від підвищення продуктивності, яке додає браузерне посилання, щоб ви не побачили попереджувальне повідомлення на консолі браузера? Краще подати помилку з Microsoft, і вона виправиться.
coding4fun

4
@ coding4fun Дякую за вашу думку; ви можете сміливо подавати помилку в Microsoft. Я не казав, що ви повинні відключити браузерну посилання. Моя відповідь точна щодо причини цього попередження в деяких випадках, і корисно виключити щось у власному коді. Я особисто почував себе краще, як тільки зрозумів, що це не те, що я зробив неправильно, і думав, що і інші можуть вважати це корисним.
Сем

Це зафіксувало більше, ніж просто попередження Ajax. Я отримав всі види безладу посилань браузера в консолі javascript за допомогою ядра 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 ("~ / script / apps / appname.js")
MsTapp

10

Це згадувалося як коментар @ henri-chan , але я думаю, він заслуговує на деяку увагу:

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

Ви знаєте, що це відбувається, коли ви бачите, що (кілька) сценаріїв або таблиць стилів завантажуються, як XHRу вікні консолі. (firefox).


3

Жодна з попередніх відповідей (які всі правильні) не підходила до моєї ситуації: я не використовую asyncпараметр у jQuery.ajax()і не включаю тег скрипту як частину вмісту, який повертався так:

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

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

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

5
Сценарії не виконуються, якщо ви безпосередньо вставляєте їх у DOM через innerHTML. Отже, коли ви викликаєте .html (), jQuery виймає та виконує будь-які сценарії, що входять у відповідь html, синхронно.
Генрі Чан

@HenryChan, я намагався тебе зрозуміти, але безрезультатно. Скажіть, будь ласка, простішими словами. Я не вставляю сценарії в DOM, я вставляю лише HTML, і все-таки це рішення є єдиним робочим рішенням для мене. Дякую заздалегідь
Адіб Аруй

2
@whitelettersinblankpapers Я думаю, що він означає: всередині вашого зворотного дзвінка Ajax, якщо вміст, який ви додаєте до вашого "діва", містить теги сценарію, то вони будуть називатися синхронно.
Haitham Sweilem

1

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


у вас є трохи коду для мене, щоб знати, як цього досягти?
ZerOne

5
@runback, чи не можна використовувати виконаний () обіцянку зворотного дзвінка? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) Сподіваюся, я нічого не перечитав.
pravin

0

Якщо ми завантажимо скрипт у частковому перегляді, тоді ця проблема виходить

  1. Я видалив сценарій у частковому перегляді та перейшов до основного.

Це рішення добре працює для мене

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.