JavaScript console.logでエラーが発生する:「メインスレッドでの同期XMLHttpRequestは廃止予定です…」


386

ログをコンソールに追加して、Firefoxデバッガーを使用せずにさまざまな変数のステータスを確認しています。

しかし、私が追加した多くの場所でconsole.log、私の中main.jsのファイル、私は自分自身に代わりに私の美しい小さな手書きのメッセージの次のエラーが表示されます。

メインスレッドでの同期XMLHttpRequestは、エンドユーザーのエクスペリエンスに悪影響を与えるため非推奨です。さらにヘルプが必要な場合はhttp://xhr.spec.whatwg.org/

console.logこのエラーを引き起こさないコードの使用に、どのような代替またはラッパーを追加できますか?

「間違っている」のでしょうか?


8
何らかの種類のリモートロギングプラグインが有効になっていないかぎり、console.log()呼び出しがどのようにajax呼び出しを引き起こすかはわかりません。
マークB 14

私はそれがajax呼び出しをしているのかわかりません。スクリーンショットを含めれば役に立ちますか?
Nathan Basanese 14

6
xmlhttprequestは基本的にajaxリクエストです。
マークB 14

14
<script>$.ajaxPrefilter(function( options, originalOptions, jqXHR ) { options.async = true; });</script> これにより警告が削除されます。同じ問題については、こちらをご覧ください。
Akilsree1 2015

1
投稿の代わりにgetを使用しただけで役に立ちました。jQuery。
Stas Kazanin、

回答:


278

これは私が怠けていたときに起こり、返されるコンテンツの一部としてスクリプトタグが含まれていました。など:

部分的なHTMLコンテンツ:

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

少なくとも私の場合、そのようなHTMLコンテンツをxhr経由で返すと、jQueryがそのスクリプトを取得するための呼び出しを行うようになります。この呼び出しは、ロードを続行するためにスクリプトが必要であると想定しているため、非同期フラグfalseで発生します。

このような状況では、なんらかのバインディングフレームワークを調べてJSONオブジェクトを返すだけで、またはバックエンドとテンプレートに応じて、スクリプトのロード方法を変更できます。

また、jQueryをgetScript()使用して関連するスクリプトを取得することもできます。ここにフィドルがあります。これはjQueryの例の単なるコピーですが、スクリプトがそのようにロードされたときにスローされる警告は表示されません。

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

http://jsfiddle.net/49tkL0qd/


8
エラーは、OPが同期XMLHttpRequestsのどこかを使用しているためです。jqueryはそれを使用していないようなので、jqueryのせいではないと思います...しかし<script>、コールバックで言ったように、 ajax非同期呼び出しの。私のAJAX呼び出しは、しかし、コールバックで私が作る非同期で$('#object').html(data)データがの部分であるところhtml<script>、このラインがでエラーが表示されますが実行されたときjs console。+1 !!! 感謝し:)ます。
albciff、2015

2
このプロジェクトでは、実際にはJQueryを使用しました。
Nathan Basanese 2015

1
@ 37coins、これが答えだった場合; そのようにマークします。JavaScriptタグをjQueryに置き換えます。
Brett Caswell、2015

3
これは私の問題であり、おそらくOPの問題でもあります。OPはこれを回答としてマークすることを検討してください。ここで投票数の多い回答は、現在この問題を抱えている人々を助けるものではないので、この回答を受け入れることは他の人を非常に助けることになります。
Nick Coad 2015年

1
FYI jQuery getScriptだけがキャッシングを壊します。.ajaxも同じように動作し、キャッシングが可能になると思います
Ronnie Royston

75

非同期フラグがfalseに設定されているメインスレッド内のXMLHttpRequestリクエストが原因で警告メッセージが表示される場合があります。

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

ワーカーの外部の同期XMLHttpRequestは、エンドユーザーのエクスペリエンスに悪影響を与えるため、Webプラットフォームから削除される過程にあります。(これは何年もかかる長いプロセスです。)JavaScriptグローバル環境がドキュメント環境である場合、開発者はasync引数にfalseを渡してはいけません。ユーザーエージェントは、開発者ツールでのこのような使用について警告することを強くお勧めします。また、発生したときにInvalidAccessError例外をスローして実験する場合があります。

将来の方向性は、ワーカースレッドでのみXMLHttpRequestsを許可することです。メッセージは、その影響に対する警告を目的としています。


6
いいえ、非同期のフラグがfalseに設定されているメインスレッド内のXMLHttpRequestリクエストが原因で、メッセージの警告はPRESUMABLYです。これはFirefoxのバグである可能性があります(ただし、jQueryの機能/実装である可能性があります)。どちらにしても、仕様の一部を説明することconsole.logは、これらの警告を送信していると主張する質問への回答とどのように見なされますか?
ブレット・キャスウェル

1
@ブレット-私の回答の最後の2つの文は、なぜ私が仕様の一部を含めたのかを説明しています。より正確になるように回答を編集します。
PedanticDan 2015年

2
以上のことから、あなたがこの回答で述べたことはすべて正しい情報です。さらに、起こりそうな問題に関連している可能性があります。つまり、この警告が発生すると、デバッガの動作や安定性に影響します。したがって、回避策は警告の原因を修正して警告が発生しないようにすることです。
Brett Caswell 2015年

ローカルデバッグを有効にするために、about:フラグを追加する必要があります。Sync XHRは、localhostを実行するツール/デバッグフレームワークに非常に役立ちます。
user2800679

62

私も同じ問題に直面していましたが、async:trueを置くことで修正できました。私はそれがデフォルトでtrueであることを知っていますが、それを明示的に書いたときに機能します

$.ajax({
   async: true,   // this will solve the problem
   type: "POST",
   url: "/Page/Method",
   contentType: "application/json",
   data: JSON.stringify({ ParameterName: paramValue }),
});

2
それは私の場合の理由ではありません... async:falseを削除するだけで、trueに変更せずに修正されました
hsobhy

私の場合、@ Irfanは同期の設定でした:falseが役立ちました!
t_plusplus 2016

34

Visual Studio 2015/2017のライブデバッガーは、非推奨の呼び出しを含むコードを挿入しています。


13
この警告が表示された理由を理解するためにかなりの時間を費やしました。他の人が時間を節約できるように、私は最も適切なSOの質問について共有すると思いました。
チャーリー

22

スクリプトを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がドキュメントの準備完了後に実行される場合、効果は同期です。

この高度な機能は、通常、DOMが準備できていても、準備完了イベントの発生を許可する前にjQueryプラグインなどの追加のJavaScriptをロードする動的スクリプトローダーによって使用されます。

ドキュメント:https :
//api.jquery.com/jquery.holdready


2019年1月7日更新

JQMIGRATEから:

jQuery.holdReady()は非推奨です

原因:jQuery.holdReady()ページのグローバルパフォーマンスに悪影響を与えるため、このメソッドは廃止されました。この方法では、ページ上のすべてのコードが長時間にわたって初期化されないようにすることができます。

解決策:すべてのjQuery対応ハンドラーを遅延させる必要がないように、ページを書き直してください。これは、たとえば、安全に実行できる場合に遅延を必要とするコードのみを後でロードすることによって実現できます。このメソッドは複雑であるため、jQuery Migrateは機能を満たそうとしません。jQuery Migrateで使用されるjQueryの基になるバージョンにjQuery.holdReady()コードが含まれなくなった場合、この警告が表示された直後にコードが失敗します。



13

@Webgrの部分的な回答は、実際にこの警告@コンソールログをデバッグするのに役立ちました。

とにかく、ここに私が私の場合にこの警告の原因が何であるかを見つけた方法があります:

  1. Chromeブラウザを使用> F12を押してDevToolsを導入
  2. ドロワーメニューを開きます(Chromeの場合は、右上の縦の3つのドット)
  3. 下にコンソール >チェックログのXMLHttpRequestsをオプションを
  4. エラーが発生したページをリロードし、コンソールログで各ajaxリクエストで何が発生するかを確認します。

私の場合、別のプラグインが2つの.jsライブラリをロードしていました各ajax呼び出しの後ていましたが、これは絶対に必要でも必要でもありませんでした。不正プラグインを無効にすると、ログから警告が削除されました。その時点から、自分で問題を修正するか(たとえば、スクリプトのロードを特定のページまたはイベントに制限する-これはここでの回答には具体的すぎるため)、サードパーティのプラグイン開発者に連絡して解決してください。

これが誰かを助けることを願っています。


//、答えてくれてありがとう!この質問はFirefoxについてのみ言及しています。Chromeで発生したことを知りたいです。ただし、実際に問題を修正するのではなく、警告を削除するだけのようです。あれは正しいですか?
Nathan Basanese

Chromeは、DevToolsでFirefoxバージョンよりも高度な機能を備えているようです。Firefoxで報告されていないという事実は、それが存在しないことを意味しません。これは私の問題を完全に修正しました。問題のあるプラグインとページから、各ajax呼び出しで「再ロード」されたスクリプトを削除しました。
dev101

//、Firefox開発者に問題を提起する価値があると思いますか?
Nathan Basanese

いいえ、必要ありません。最新のFirefoxでケースを再テストしたところ、「メインスレッドでの同期XMLHttpRequest ...」警告がコンソールログにも確実に報告されました。つまり、少なくとも私の場合は、ブラウザ固有の問題ではありませんでした。次に、Firefoxを使用して、各ajaxリクエストの後に呼び出される.jsリソースを監視することにより、[ネットワーク]タブを介してXMLHttpRequestをデバッグする方法を説明します。同じことをしますが、Chromeではより合理化/フィルタリングされています。 developer.mozilla.org/en-US/docs/Tools/Network_Monitor
dev101

8

私はすべて印象的な答えを見てきました。彼は彼に問題を引き起こしているコードを提供するべきだと思います。以下の例を考えると、page.phpにjqueryにリンクするスクリプトがある場合、その通知を受け取ります。

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

6

次のような場合にこのような警告が表示されます。

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ので、ロードしてページがリロードされない(jqueryを使用して外部のphpファイルにデータを送信する$.post)ため、jquery-1.10.2.js存在し続けます。したがって、再度ロードする必要はありません。


5

「example.com/files/text.txt」のようなクエリでURLを設定すると、この例外が発生しました。URLを「http://example.com/files/text.txt」に変更しましたが、この例外はなくなりました。


私の問題もURLに関係しているようです。スクリプトを一時的なURLにコピーして作業しましたが、そのときにエラーが表示されました。元のURLからではありません。
jeffery_the_wind 2017年


5

MVCアプリケーションでは、PartialView()ではなくView()を返すメソッドで剣道ウィンドウを開いていたため、この警告が表示されました。View()は、ページのすべてのスクリプトを再度取得しようとしました。


5

それはZF2で私に起こっていました。モーダルコンテンツをロードしようとしましたが、以前にレイアウトを無効にするのを忘れていました。

そう:

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

5

@Nycenと同様に、Cloudfareへのリンクが原因でこのエラーも発生しました。私はSelect2プラグイン用でした。

修正するために削除しました

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

エラーはなくなりました。


5
  1. Chromeでは、 press F12
  2. 開発ツール->を押しF1ます。
  3. 設定"Don't show chrome Data Saver warning"- >一般- >外観を参照してください:-このチェックボックスを設定します。
  4. 設定"Log XMLHTTPRequest"- >一般- >コンソールを参照してください:-このチェックボックスも設定します。

楽しい



4

私の場合、これはCloudflareが提供する「CDNJS Selections」アプリの一部であるflexieスクリプトが原因でした。

Cloudflareによると、「このアプリは2015年3月に廃止される予定です」。オフにすると、メッセージはすぐに消えました。

https://www.cloudflare.com/a/cloudflare-apps/yourdomain.comにアクセスして、アプリにアクセスできます

注意:これは、このスレッドの同期XMLHttpRequest警告と<script>の私の回答のコピーです(解決策を探すときに両方にアクセスしました)


3

以下の手順でこれを修正しました:

  1. CDNスクリプトを確認し、ローカルに追加します。
  2. スクリプトのインクルードをヘッダーセクションに移動します。

3

私の特定のケースではrender layout: false<head>タグのすべてのスクリプトを含むレイアウト全体を再レンダリングせずに、Railsパーシャルをレンダリングしていました。render layout: falseコントローラーアクションに追加すると、問題が修正されました。


3

私にとっての問題は、OKリクエストでは、ajaxレスポンスがテーブルなどの適切にフォーマットされたHTML文字列であると想定していたことですが、この場合、サーバーでリクエストに問題が発生し、エラーページにリダイレクトされました。エラーページのHTMLコードを返していました(<scriptどこかにタグがありました。コンソールにajax応答が記録されましたが、それが予期したものではないことに気づき、デバッグを開始しました。


2

2014年に出された質問とそれは2019年なので、より良いオプションを探すのは良いことだと思います。

あなたは単に使うことができます fetchJavaScriptでAPIをするだけで、柔軟性が向上します。

たとえば、このコードを参照してください

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

これは純粋なjsですか、プラグインは必要ありませんか?
Alok、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.