JavaScript console.log вызывает ошибку: «Синхронный XMLHttpRequest в основном потоке устарел…»

349

Я добавляю журналы на консоль, чтобы проверить статус разных переменных, не используя отладчик Firefox.

Тем не менее, во многих местах, где я добавляю console.log в мой файл main.js, я получаю следующую ошибку вместо моих прекрасных маленьких рукописных сообщений себе:

Синхронный XMLHttpRequest в основном потоке устарел из-за его пагубных последствий для конечного пользователя. Для получения дополнительной справки http://xhr.spec.whatwg.org/

Какие альтернативы или обертки для console.log можно добавить в мой код, который не вызовет эту ошибку?

Я делаю это неправильно?

  • 8
    Я не понимаю, как вызов console.log () может вызвать ajax-вызов, если только не включен какой-либо подключаемый модуль удаленной регистрации или что-то подобное.
  • 0
    Я не уверен, что он делает вызов ajax. Поможет ли мне включить скриншот?
Показать ещё 6 комментариев
Теги:
console.log
debugging
firefox
backbone.js

22 ответа

241

Это случилось со мной, когда я был ленивым и включил тег script как часть возвращаемого содержимого. В качестве таких:

Частичное содержимое HTML:

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

Похоже, по крайней мере, в моем случае, что если вы вернете HTML-контент, подобный этому, через xhr, вы заставите jQuery вызвать этот скрипт. Этот вызов происходит с ложным асинхронным флагом, так как он предполагает, что для продолжения загрузки необходим скрипт.

В подобных ситуациях вам будет лучше, если вы посмотрите на какую-то связывающую среду и просто вернете объект JSON, либо, в зависимости от вашего бэкенда и шаблонов, вы можете изменить способ загрузки своих скриптов.

Вы также можете использовать jQuery getScript() для получения соответствующих скриптов. Вот скрипка, это просто прямая копия примера jQuery, но я не вижу никаких предупреждений, когда скрипты загружаются таким образом.

пример

<script>
var url = "/scripts/script.js";
$.getScript(url);
</script>

http://jsfiddle.net/49tkL0qd/

  • 5
    ошибка в том, что OP использует где-то синхронный XMLHttpRequests, я не думаю, что из-за jquery, так как не кажется, что он его использует ... однако это происходит со мной, когда я пытаюсь загрузить <script> как вы сказали в обратном вызове асинхронного вызова ajax. Мой ajax-вызов асинхронный, однако в обратном вызове я делаю $('#object').html(data) где data - это фрагмент html с <script> и когда эта строка выполняется, в js console появляется ошибка. +1 !!! спасибо :)
  • 1
    Для этого проекта я использовал JQuery.
Показать ещё 13 комментариев
69

Предупреждающее сообщение МОЖЕТ БЫТЬ из-за запроса XMLHttpRequest в основном потоке с флагом async, установленным на false.

https://xhr.spec.whatwg.org/#synchronous-flag:

Синхронный XMLHttpRequest за пределами рабочих находится в процессе удаляется с веб-платформы, поскольку это имеет опыт конечного пользователя. (Это длительный процесс, который требует много лет.) Разработчики не должны передавать false для аргумента async, если Глобальная среда JavaScript - это среда документа. Пользовательские агенты настоятельно рекомендуется предупреждать о таком использовании в инструментах разработчика и может экспериментировать с вызовом исключения InvalidAccessError, когда это происходит.

Будущее направление - разрешить только XMLHttpRequests в рабочих потоках. Сообщение должно быть предупреждением об этом.

  • 6
    нет, предупреждение о сообщении является НАСТОЯЩИМ из-за запроса XMLHttpRequest в главном потоке с установленным в асинхронном флаге значением false. Это вполне может быть ошибка в Firefox (но, скорее всего, это функция / реализация jQuery); в любом случае, как описание части спецификации можно считать ответом на вопрос, который утверждает, что console.log отправляет эти предупреждения?
  • 1
    @ Бретт - последние два предложения моего ответа объясняют, почему я включил часть спецификации, которую я сделал. Я отредактирую свой ответ, чтобы быть более точным.
Показать ещё 2 комментария
56

Я также столкнулся с такой же проблемой, но смог ее исправить, поставив async: true. Я знаю, что это по умолчанию true, но работает, когда я пишу его явно

$.ajax({
   async: true,   // this will solve the problem
   type: "POST",
   url: "/Page/Method",
   contentType: "application/json",
   data: JSON.stringify({ ParameterName: paramValue }),
});
  • 19
    даже если для async установлено значение true, ошибка та же
  • 2
    В моем случае это не было причиной ... только удаление async: false без замены на true исправлено, что
Показать ещё 1 комментарий
27

Visual Studio 2015/2017 Live debugger вводит код, содержащий устаревший вызов.

  • 0
    Для меня это Hotjar Analytics, для меня ваш ответ совершенно бессмысленный, поскольку нигде в исходном вопросе он не утверждал, что использует / использовал Visual Studio.
  • 7
    Я провел довольно много времени, пытаясь понять, почему я вижу это предупреждение; Я подумал, что поделюсь наиболее подходящим вопросом SO, чтобы другие могли сэкономить время.
Показать ещё 1 комментарий
15

Иногда необходимо ajax загрузить скрипт, но отложить готовность документа до окончания загрузки скрипта.

jQuery поддерживает это с помощью функции holdReady().

Пример использования:

$.holdReady(true);                              //set hold
function releaseHold() { $.holdReady(false); }  //callback to release hold
$.getScript('script.js', releaseHold);          //load script then release hold

Фактическая загрузка скрипта является асинхронной (без ошибок), но эффект является синхронным, если остальная часть JavaScript выполняется после готовности документа.

Эта расширенная функция обычно используется динамическими загрузчиками сценариев, которые хотят загрузить дополнительный JavaScript, такой как плагины jQuery, перед тем как разрешить событие ready, даже если DOM может быть готов.

Документация:
https://api.jquery.com/jquery.holdready


ОБНОВЛЕНИЕ 7 января 2019

От JQMIGRATE:

jQuery.holdReady() устарела

Причина. Метод jQuery.holdReady() устарел из-за его негативного влияния на jQuery.holdReady() производительность страницы. Этот метод может предотвратить инициализацию всего кода на странице в течение продолжительного времени.

Решение: переписать страницу так, чтобы не требовалось откладывать все готовые обработчики jQuery. Это может быть достигнуто, например, поздней загрузкой только кода, который требует задержки, когда это безопасно для выполнения. Из-за сложности этого метода jQuery Migrate не пытается заполнить функциональность. Если базовая версия jQuery, используемая с jQuery Migrate, больше не содержит jQuery.holdReady() код завершится ошибкой вскоре после появления этого предупреждения.

13

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

async: false

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

По умолчанию используется

async: true

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

12

@Webgr частичный ответ на самом деле помог мне отладить это предупреждение @console log, стыдно, что другая часть этого ответа принесла так много downvotes: (

В любом случае, вот как я узнал, в чем причина этого предупреждения в моем случае:

  • Используйте Chrome Browser > Hit F12, чтобы принести DevTools
  • Откройте меню ящика (в вертикальных точках Chrome 3 в правом верхнем углу)
  • В Консоль > установите флажок Log XMLHttpRequests
  • Загрузите свою страницу, которая давала вам ошибку, и наблюдайте, что происходит в каждом запросе ajax в журнале консоли.

В моем случае другой плагин загружал 2 .js библиотеки после каждого вызова ajax, которые абсолютно не требовались и не требовались. Отключение плагина-изгоя удалило предупреждение из журнала. С этого момента вы можете либо попытаться решить проблему самостоятельно (например, ограничить загрузку скриптов на определенные страницы или события - это слишком специфично для ответа здесь), либо обратиться к разработчику плагинов сторонних разработчиков, чтобы решить эту проблему.

Надеюсь, это поможет кому-то.

  • 0
    // , Спасибо за ответ! Этот вопрос относится только к Firefox. Мне интересно увидеть, что это произошло на Chrome. Это только кажется, что удаляет предупреждение, а не исправляет проблему. Это верно?
  • 0
    Похоже, что Chrome имеет более продвинутые возможности в DevTools, чем версия Firefox. Тот факт, что об этом не сообщается в Firefox, не означает, что его нет. Это полностью исправило мою проблему, а не просто скрыло ее. Я удалил скрипты из проблемного плагина и страницы, которые «перезагружались» при каждом вызове ajax.
Показать ещё 2 комментария
7

Я смотрю на все впечатляющие ответы. Я думаю, что Он должен предоставить код, который дает ему проблему. В приведенном ниже примере, если у вас есть script для ссылки на jquery в page.php, вы получите это уведомление.

$().ready(function () {
    $.ajax({url: "page.php",
        type: 'GET',
        success: function (result) {
        $("#page").html(result);
   }});
 });
5

Я получаю такое предупреждение в следующем случае:

1) file1, который содержит <script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>. Страница содержит поля ввода. Я ввожу какое-то значение в поле ввода и нажмите кнопку. JQuery отправляет вход во внешний файл php.

2) внешний php файл также содержит jquery, а во внешнем php файле я также включил <script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script>. Потому что, если это я получил предупреждение.

Удалено <script type="text/javascript" src="/javascript/jquery-1.10.2.js"></script> из внешнего php файла и работает без предупреждения.

Как я понимаю при загрузке первого файла (file1), я загружаю jquery-1.10.2.js и, поскольку страница не перезагружается (он отправляет данные во внешний php файл с помощью jquery $.post), то jquery-1.10.2.js продолжают существовать. Поэтому не нужно снова загружать его.

4
  • В Chrome press F12
  • Инструменты девелопмента → нажмите F1.
  • См. settings- > general- > Apperance: "Don't show chrome Data Saver warning" - установите этот флажок.
  • См. settings- > general- > Console: "Log XMLHTTPRequest" - установите этот флажок тоже.

Enjoy

4

Как @Nycen, я также получил эту ошибку из-за ссылки на Cloudfare. Моя была для плагина Select2.

чтобы исправить его, я просто удалил

 src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"

и ошибка исчезла.

4

Это происходило со мной в ZF2. Я пытался загрузить контент Modal, но я забыл отключить компоновку раньше.

Итак:

$viewModel = new ViewModel();
$viewModel->setTerminal(true);
return $viewModel;
4

В приложении MVC я получил это предупреждение, потому что открывал окно Kendo с методом, возвращающим View() вместо PartialView(). Функция View() пыталась снова извлечь все сценарии страницы.

4

И я получил это исключение для включения одного can.js script внутри другого, например,

{{>anotherScript}}
  • 0
    Похоже, это основная причина (загрузка дополнительных <scripts> и добавление их в <head> в DOM)
4

Я получил это исключение, когда я задал URL-адрес в запросе типа example.com/files/text.txt. Ive изменил url на " http://example.com/files/text.txt", и это исключение исчезло.

  • 0
    Моя проблема также, кажется, связана с URL. Я скопировал скрипт на временный URL, чтобы поработать с ним, и именно тогда появилась ошибка. Не с оригинального URL.
3

Это решено в моем случае.

JS

$.ajaxPrefilter(function( options, original_Options, jqXHR ) {
    options.async = true;
});

Этот ответ был вставлен в эту ссылку

/questions/26348/synchronous-xmlhttprequest-warning-and-script

3

В моем случае это было вызвано flexie script, которое было частью приложения "CDNJS Selections", предлагаемого Cloudflare.

Согласно Cloudflare "Это приложение устарело в марте 2015 года". Я отключил его, и сообщение исчезло мгновенно.

Вы можете получить доступ к приложениям, посетив https://www.cloudflare.com/a/cloudflare-apps/yourdomain.com

NB: это копия моего ответа в этом потоке Синхронное предупреждение XMLHttpRequest и <script> (я посетил как при поиске решения)

2

Для меня проблема заключалась в том, что в запросе OK я ожидал, что ответ ajax будет хорошо отформатированной строкой HTML, такой как таблица, но в этом случае на сервере возникла проблема с запросом, перенаправляющая на страницу ошибки, и поэтому возвращал обратно HTML-код страницы с ошибкой (где-то был тег <script. Я консоль записал ответ ajax и, когда я понял, что это не то, что я ожидал, затем приступил к отладке.

2

В моем конкретном случае я предоставлял частичный Rails без render layout: false, который перерисовывал весь макет, включая все скрипты в теге <head>. Добавление render layout: false к действию контроллера устранило проблему.

2

Я исправил это с помощью следующих шагов:

  • Проверьте свои CDN-скрипты и добавьте их локально.
  • Переместить ваши скрипты в раздел заголовка.
0

это случилось со мной, когда при вызове Ajax я включал файл, в котором выполнялся другой скрипт, в моем случае - LOADER. В результате загрузчик никогда не уходил в тайм-аут, просто удалите импорт файла в файле обратного вызова.

Надеюсь, поможет

0

Вопрос поставлен в 2014 году, а в 2019 году, так что я думаю, что это хорошо, чтобы найти лучший вариант.

Вы можете просто использовать fetch api в Javascript, что обеспечит вам большую гибкость.

например, посмотрите этот код

fetch('./api/some.json')
    .then((response) => {
        response.json().then((data) => { 
            ... 
        });
    })
    .catch((err) => { ... });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню