2015-01-02 3 views
94

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

deprecated because of its detrimental effects to the end user's experience.

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

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

+2

Вы должны говорить о синхронных XMLHttpRequests, а не асинхронные Ones, правильно? Синхронные запросы ужасны для конечного пользователя (они блокируют браузер во время запроса) и, как правило, не должны использоваться. – jfriend00

+2

Предоставить некоторый код, который запускает этот код – charlietfl

+0

Я не пишу ни одного служебного кода в данный момент, моя забота: я хочу научиться писать код, который не требует избегаемого обслуживания с течением времени. Я знаю, что могу работать с ajax, но пока еще не понял концепцию. По этой причине я использовал пример jquery. @charlietfl – Edward

ответ

106

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

async: false 

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

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

+8

Это предупреждение jQuery. Я могу игнорировать его? Я не использую синхронные вызовы на сервер. Перфекционистская сторона меня вообще не любит иметь предупреждения. – Jordan

+1

@ Jordan Я думаю, что предупреждение исходит от браузера, а не jQuery. Это произойдет, когда вы попытаетесь использовать синхронный AJAX. Если вы используете jQuery, это произойдет, только если вы укажете эту опцию '$ .ajax'. – Barmar

+0

Я работаю с 'jquery-2.1.4.min.js', и у меня такое же предупреждение в Firefox, Chrome и Opera, и я не использую'. $ .ajax() '. Когда я нажимаю на это предупреждение, он, конечно, открывает файл 'jquery-2.1.4.min.js'. –

1

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

+0

у вас есть немного кода для меня, чтобы знать, как достичь этого? – ZerOne

+5

@runback, нельзя ли использовать обратный вызов done()? '$ .ajax ({ URL: "example.com", асинхронные: истина/* по умолчанию верно */ }) сделано (функция (ответ) { // Обработать дамп })' . Надеюсь, что я ничего не читал. – pravin

13

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

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

Это не имеет ничего общего с JQuery.

Вы, вероятно, увидеть тот же делать что-то вроде этого:

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

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

+0

Предупреждение ушло за мной, когда я удалил такую ​​строку, которую я не использовал: @ Html.Script ("~/scripts/apps/appname.js") – MrsTapp

58

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

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

Disable Browser Link

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

+0

Можно отключить в 'web.config' добавив '' inside '' как описано здесь: http://www.poconosystems.com/software-development/how-to-disable-browser- ссылка-в-визуальному-студия-2013 /. – Beel

+3

Я думаю, что это плохое предложение просто для того, чтобы получить предупреждение о предупреждениях в консоли. Отключить браузер и избавиться от улучшений производительности, которые добавляет браузер, поэтому вы не увидите предупреждающее сообщение в консоли браузера? Лучше регистрировать ошибку с помощью microsoft, и она исправляется. – coding4fun

+3

@ coding4fun Спасибо за ваше мнение; вы можете свободно сообщать об ошибке в Microsoft. Я не говорил, что вы должны отключить Browser Link. В некоторых случаях мой ответ верен в отношении причины этого предупреждения, и полезно исключить что-то в своем собственном коде. Я лично чувствовал себя лучше, когда понял, что это не то, что я сделал неправильно, и подумал, что другие могут найти его полезным. – Sam

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

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

Сценарии не выполняются, если вы непосредственно вставляете их в DOM через innerHTML. Поэтому, когда вы вызываете .html(), jQuery извлекает и выполняет любые скрипты, включенные в html-ответ, синхронно. –

+0

@HenryChan, я пытался понять вас, но безрезультатно. Не могли бы вы объяснить мне более простые слова. Я не вставляю скрипты в DOM, я вставляю только HTML и все же это решение является единственным рабочим решением для меня. Заранее спасибо –

+1

@whitelettersinblankpapers Я думаю, что он имеет в виду: внутри вашего обратного вызова ajax, если содержимое, которое вы добавляете к вашему «div», содержит скриптовые теги, то они будут вызываться синхронно. –

Смежные вопросы