jQueryは同期XMLHTTPRequestを非推奨にしました


119

他の多くの人と同様に、私のウェブサイトはjQueryを使用しています。開発者ツールを開くと、XMLHTTPRequestが

エンドユーザーのエクスペリエンスに悪影響を与えるため非推奨です。

続けてドキュメントの一部を読みましたが、かなり技術的でした。XMLHTTPRequestからWHATWGに移行した結果を誰かが簡単に説明できますか?それは2012年に起こったと述べています。

また、ドキュメントには、ワーカーの外部の同期XMLHttpRequestがWebプラットフォームから削除されている最中であると記載されています。その場合、ユーザーエージェントがサービスにそれらを持っている場合、既存のコードを変更する必要がありますか?


2
非同期のXMLHTTPRequestではなく、同期のXMLHTTPRequestについて話している必要がありますよね?同期要求は、エンドユーザーエクスペリエンスにとって恐ろしいものであり(要求中にブラウザーをロックする)、通常は使用しないでください。
jfriend00

2
これをトリガーするいくつかのコードを提供
charlietfl

3
これは問題の全文ですか?メインスレッドでの同期XMLHttpRequestは、エンドユーザーのエクスペリエンスに悪影響を与えるため非推奨です。
カンタス航空94ヘビー

1
jQueryは同期リクエストに対してのみ警告を出しますよね?意図的に同期リクエストを行っていますか?もしそうなら、解決策は非同期リクエストで動作するようにコードを構成することです。ユーザーの観点からははるかに優れているので、とにかくそれを行う必要があります。
nnnnnn 2015年

1
私のウェブサイトだけでなく、Youtubeなどの他のサイトでもこのフラグを確認しました。仕様に関して、私のコードが準拠している必要がある仕様は、W3CまたはWHATWGですか?、私がメインスレッドで尋ねたくない参照は、私が推測する問題としてフラグが立てられることになるためです。@ Qantas94Heavy
Edd、

回答:


136

この警告を回避するには、以下を使用しないでください。

async: false

あなたの$.ajax()電話のいずれかで。これはXMLHttpRequest非推奨の唯一の機能です。

デフォルトはasync: trueなので、このオプションをまったく使用しない場合、機能が本当に削除されてもコードは安全です。

しかし、おそらくそうならないでしょう-それは標準から削除されるかもしれませんが、ブラウザは何年もの間それをサポートし続けるだろうと私は思うでしょう。したがって、何らかの理由で本当に同期AJAXが必要な場合はasync: false、警告を使用して無視することができます。しかし、同期AJAXが貧弱なスタイルと見なされるのには十分な理由があるため、おそらくそれを回避する方法を模索する必要があります。また、Flashアプリケーションを作成した人たちは、それがなくなるとは思ってもいませんでしたが、現在は段階的に廃止されようとしています。

Fetch置き換えられるAPI XMLHttpRequestは同期オプションさえ提供していないことに注意してください。


9
これは、jQueryの警告です。無視できますか?サーバーへの同期呼び出しは使用しません。私の完璧主義者の側は警告をするのが好きではありません。
ヨルダン

2
@ジョーダン警告はjQueryではなくブラウザからのものだと思います。同期AJAXを使用しようとするたびに発生します。jQueryを使用する場合、そのオプションをに指定した場合にのみ発生します$.ajax
Barmar 2015

2
私は使用してjquery.i18n.properties.jsいますが、$.ajax.おそらく社内で明示的な呼び出しはありませんが、確かではありません。
Manuel Jordan

1
そのプラグインは、.propertiesファイルからリソースバンドルをロードします。おそらく同期AJAXを使用してこの警告を引き起こしています。
Barmar

1
@ManuelJordan設定async:i18nでtrueを設定すると、低速接続でページに表示される文字列の表示に遅延が発生する可能性があります。代わりに文字列コードを表示
Siyon DP '28

62

受け入れられた答えは正しいですが、Visual Studio 2013以降のASP.NETで開発していて、同期ajaxリクエストを作成したり、スクリプトを間違った場所に定義したりしていない場合は、別の原因が見つかりました。

解決策は、時計回りの小さな更新アイコンで示されるVSツールバードロップダウンの[ブラウザリンクを有効にする]をオフにして、[ブラウザリンク]機能を無効にすることです。これを実行してページをリロードするとすぐに、警告が停止するはずです!

ブラウザリンクを無効にする

これはローカルでデバッグしているときにのみ発生しますが、警告の原因を知っておくと便利です。


ここで説明されているように内部をweb.config追加することで無効にすることができます:poconosystems.com/software-development/…<add key="vs:EnableBrowserLink" value="false" /><appSettings>
Beel

3
これは、コンソールで警告メッセージを表示するだけの悪い提案だと思います。browserlinkを無効にして、browserlinkによって追加された生産性の向上を取り除いて、ブラウザコンソールに警告メッセージが表示されないようにしますか?マイクロソフトにバグを報告することをお勧めします。修正されます。
Coding4Funの

4
@ coding4funご意見ありがとうございます。Microsoftに自由にバグを報告してください。ブラウザリンクを無効にする必要があるとは言っていません。私の答えは、この警告の原因については正確である場合があり、独自のコードで何かを除外することは有用です。自分が間違ったことではなく、他の人にも役立つと思うと、私は個人的に気分が良くなりました。
Sam

これは、単なるajax警告よりも修正されました。aspコアを使用して、JavaScriptコンソールであらゆる種類のブラウザーリンクの混乱を取得しました。
JoeBass

ブラウザーのリンクとは何か知っている人がいるのでしょうか。また、なぜこのような警告が表示されるのでしょうか。
ギデオン2017年

15

これは、ボディセクションの終わりの直前に、頭の外側にある外部jsへのリンクがあることによって起こりました。あなたは知っています、これらのうちの1つ:

<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( "〜/ scripts / apps / appname.js")
MsTapp

10

@ henri-chanからコメントとして言及されましたが、もっと注目に値すると思います:

jQuery / javascriptを使用して要素のコンテンツを新しいhtmlで更新し、この新しいhtmlに<script>タグが含まれている場合、それらは同期的に実行されるため、このエラーがトリガーされます。同じことがスタイルシートにも当てはまります。

これはXHR、コンソールウィンドウのように(複数の)スクリプトまたはスタイルシートが読み込まれているときに発生します。(Firefox)。


3

以前の答え(どれも正しい)はどれも私の状況に適していませんでした。asyncパラメーターを使用jQuery.ajax()せず、返されるコンテンツの一部として次のようにスクリプトタグを含めていません。

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

私の状況では、2つのdivを同時に更新する目的で、2つの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
innerHTMLを介してDOMに直接挿入した場合、スクリプトは実行されません。したがって、.html()を呼び出すと、jQueryはHTML応答に含まれるすべてのスクリプトを同期的にフェッチして実行します。
Henry Chan

@HenryChan、私はあなたを理解しようとしましたが、役に立ちませんでした。簡単な言葉で説明してください。スクリプトをDOMに挿入しません。HTMLのみを挿入しますが、このソリューションが唯一の実用的なソリューションです。よろしく
お願いします

2
@whitelettersinblankpapers彼が意味すると思う:ajaxコールバック内で、「div」に追加するコンテンツにスクリプトタグが含まれている場合、これらは同期的に呼び出されます。
Haitham Sweilem 16

1

私の回避策:コードをバッファにダンプする非同期リクエストを使用します。毎秒バッファをチェックするループがあります。ダンプがバッファに到着したら、コードを実行します。タイムアウトも使用します。エンドユーザーの場合、ページは、同期リクエストが使用されるかのように機能します。


これを達成する方法を知るための少しのコードがありますか?
ZerOne 2015年

5
@ runback、done()promiseコールバックは使用できませんか? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) 私は何も誤解していないことを願っています。
プラビン、2015年

0

スクリプトを部分ビューでロードすると、この問題が発生します

  1. 部分ビューでスクリプトを削除し、メインビューに移動しました。

このソリューションは私にとってうまくいきます

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