jQuery hat synchrones XMLHTTPRequest abgelehnt

119

Wie viele andere verwendet meine Website jQuery. Wenn ich die Entwicklertools öffne, wird eine Warnung angezeigt, die besagt, dass XMLHTTPRequest lautet

veraltet wegen seiner nachteiligen Auswirkungen auf die Erfahrung des Endbenutzers.

Ich fuhr fort und las einen Teil der Dokumentation , aber es war ziemlich technisch. Kann jemand die Konsequenzen einer Umstellung von XMLHTTPRequest auf WHATWG in einfachen Worten erklären? Es heißt, es sei 2012 passiert.

Außerdem heißt es in der Dokumentation, dass Synchronous XMLHttpRequest außerhalb von Workern gerade von der Webplattform entfernt wird. Wenn dies passiert, wenn ein Benutzeragent sie in einem Dienst hatte, müssen sie dann ihren vorhandenen Code ändern?

Edd
quelle
2
Sie müssen über synchrone XMLHTTPRequests sprechen, nicht über asynchrone, richtig? Synchrone Anforderungen sind für die Endbenutzererfahrung schrecklich (sie sperren den Browser während der Anforderung) und sollten im Allgemeinen nicht verwendet werden.
jfriend00
2
Geben Sie
3
Ist das der fragliche Volltext? Die synchrone XMLHttpRequest im Hauptthread ist aufgrund ihrer nachteiligen Auswirkungen auf die Benutzererfahrung veraltet.
Qantas 94 Heavy
1
jQuery gibt diese Warnung nur für synchrone Anforderungen aus, nicht wahr? Stellen Sie absichtlich eine synchrone Anfrage? In diesem Fall besteht die Lösung darin, Ihren Code so zu strukturieren, dass er mit asynchronen Anforderungen arbeitet. Dies sollten Sie trotzdem tun, da diese aus Sicht des Benutzers viel besser sind.
nnnnnn
1
Ich habe diese Flagge nicht nur auf meiner Website gesehen, sondern auch einige andere, z. B. Youtube. In Bezug auf Spezifikationen, mit welcher Spezifikation sollte mein Code konform sein, W3Cs oder WHATWGs? , Referenz, die ich im Haupt-Thread nicht fragen möchte, da dies meiner Meinung nach als Ansichtssache gekennzeichnet wäre. @ Qantas94Heavy
Edd

Antworten:

136

Verwenden Sie nicht, um diese Warnung zu vermeiden:

async: false

in einem Ihrer $.ajax()Anrufe. Dies ist die einzige Funktion XMLHttpRequest, die veraltet ist.

Die Standardeinstellung ist async: true: Wenn Sie diese Option überhaupt nicht verwenden, sollte Ihr Code sicher sein, wenn die Funktion jemals wirklich entfernt wird.

Dies wird jedoch wahrscheinlich nicht der Fall sein - es wird möglicherweise aus den Standards entfernt, aber ich wette, Browser werden es noch viele Jahre lang unterstützen. Wenn Sie also aus irgendeinem Grund wirklich synchrones AJAX benötigen, können Sie async: falsedie Warnungen verwenden und einfach ignorieren. Es gibt jedoch gute Gründe, warum synchrones AJAX als schlechter Stil angesehen wird. Daher sollten Sie wahrscheinlich versuchen, einen Weg zu finden, dies zu vermeiden. Und die Leute, die Flash-Anwendungen geschrieben haben, hätten wahrscheinlich auch nie gedacht, dass sie verschwinden würden, aber sie werden gerade auslaufen.

Beachten Sie, Fetchdass die zu ersetzende API XMLHttpRequestnicht einmal eine synchrone Option bietet.

Barmar
quelle
9
Dies ist dann die Warnung von jQuery. Ich kann es ignorieren? Ich verwende keine synchronen Anrufe an den Server. Die perfektionistische Seite von mir mag es überhaupt nicht, Warnungen zu haben.
Jordanien
2
@ Jordan Ich denke, die Warnung kommt vom Browser, nicht von jQuery. Dies geschieht immer dann, wenn Sie versuchen, synchrones AJAX zu verwenden. Wenn Sie jQuery verwenden, geschieht dies nur, wenn Sie diese Option angeben $.ajax.
Barmar
2
Ich benutze, jquery.i18n.properties.jsaber es gibt keinen expliziten Aufruf von meiner Seite, $.ajax.vielleicht intern, aber nicht sicher.
Manuel Jordan
1
Dieses Plugin lädt Ressourcenpakete aus .propertiesDateien. Es wird wahrscheinlich synchrones AJAX verwendet, was diese Warnung verursacht.
Barmar
1
Die Einstellung von @ManuelJordan async: true in i18n kann zu einer Verzögerung beim Anzeigen der auf Ihrer Seite angezeigten Zeichenfolgen bei langsamer Verbindung führen. Zeigen Sie stattdessen den Zeichenfolgencode
Siyon DP
62

Die akzeptierte Antwort ist korrekt, aber ich habe eine andere Ursache gefunden, wenn Sie unter ASP.NET mit Visual Studio 2013 oder höher entwickeln und sicher sind, dass Sie keine synchronen Ajax-Anforderungen gestellt oder Skripte an der falschen Stelle definiert haben.

Die Lösung besteht darin, die Funktion "Browser-Link" zu deaktivieren, indem Sie "Browser-Link aktivieren" in der Dropdown-Liste der VS-Symbolleiste deaktivieren, die durch das kleine Aktualisierungssymbol im Uhrzeigersinn angezeigt wird. Sobald Sie dies tun und die Seite neu laden, sollten die Warnungen aufhören!

Browser-Link deaktivieren

Dies sollte nur beim lokalen Debuggen geschehen, aber es ist immer noch schön, die Ursache der Warnungen zu kennen.

Sam
quelle
Man kann in deaktivieren web.configdurch Zugabe von <add key="vs:EnableBrowserLink" value="false" />innen <appSettings>wie hier beschrieben: poconosystems.com/software-development/... .
Beel
3
Ich denke, dies ist ein schlechter Vorschlag, nur um Warnmeldungen in der Konsole zu erhalten. Deaktivieren Sie den Browserlink und entfernen Sie die Produktivitätsverbesserungen, die durch den Browserlink hinzugefügt werden, damit in der Browserkonsole keine Warnmeldung angezeigt wird. Besser einen Fehler bei Microsoft einreichen und er wird behoben.
Codierung4fun
4
@ Kodierung4fun Danke für deine Meinung; Sie können gerne einen Fehler bei Microsoft melden. Ich habe nicht gesagt, dass Sie Browser Link deaktivieren sollten. Meine Antwort ist in einigen Fällen zutreffend in Bezug auf die Ursache dieser Warnung und es ist nützlich, etwas in Ihrem eigenen Code auszuschließen. Ich persönlich fühlte mich besser, als ich merkte, dass ich nichts falsch gemacht hatte und dachte, andere könnten es auch hilfreich finden.
Sam
Dies behebt mehr als nur die Ajax-Warnung. Ich habe alle Arten von Browser-Link-Chaos in der Javascript-Konsole mit Asp Core.
JoeBass
Würde jemand wissen, was ein Browser-Link ist und warum er am Ende eine solche Warnung ausgibt?
Gideon
15

Dies geschah mir, indem ich kurz vor dem Ende des Körperteils einen Link zu externen js außerhalb des Kopfes hatte. Sie wissen, eine davon:

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

Es hatte nichts mit JQuery zu tun.

Sie würden wahrscheinlich dasselbe sehen, wenn Sie so etwas tun:

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

Aber ich habe diese Idee nicht getestet.

Dave Friend
quelle
Die Warnung verschwand für mich, als ich eine Zeile wie diese entfernte, die ich sowieso nicht verwendete: @ Html.Script ("~ / scripts / apps / appname.js")
MsTapp
10

Es wurde als Kommentar von @ henri-chan erwähnt , aber ich denke, es verdient etwas mehr Aufmerksamkeit:

Wenn Sie den Inhalt eines Elements mit jQuery / javascript mit neuem HTML aktualisieren und dieses neue HTML <script>Tags enthält , werden diese synchron ausgeführt und lösen so diesen Fehler aus. Gleiches gilt für Stylesheets.

Sie wissen, dass dies geschieht, wenn (mehrere) Skripte oder Stylesheets wie XHRim Konsolenfenster geladen werden . (Feuerfuchs).

Hugo Delsing
quelle
3

Keine der vorherigen Antworten (die alle korrekt sind) war für meine Situation geeignet: Ich verwende den asyncParameter in nicht jQuery.ajax()und füge kein Skript-Tag als Teil des zurückgegebenen Inhalts hinzu:

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

Meine Situation ist, dass ich zwei AJAX-Anfragen nacheinander aufrufe, um zwei Divs gleichzeitig zu aktualisieren:

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();

Wenn ich auf a.anchor3klicke, wird das Warnflag ausgelöst. Ich habe das Problem behoben, indem ich den Aufruf von f2 durch die click()Funktion ersetzt habe:

function anchor_problem(){
$('a.anchor_problem').click(function(){
     f1();
     $('a.anchor_f2').click();
});
}
Adib Aroui
quelle
5
Skripte werden nicht ausgeführt, wenn Sie sie über innerHTML direkt in das DOM einfügen. Wenn Sie also .html () aufrufen, ruft jQuery alle in der HTML-Antwort enthaltenen Skripte synchron ab und führt sie aus.
Henry Chan
@ HenryChan, ich habe versucht dich zu verstehen, aber ohne Erfolg. Könnten Sie mir bitte in einfacheren Worten erklären. Ich füge keine Skripte in das DOM ein, ich füge nur HTML ein und trotzdem ist diese Lösung die einzige funktionierende Lösung für mich. Vielen Dank im Voraus
Adib Aroui
2
@whitelettersinblankpapers Ich denke, er meint: Wenn in Ihrem Ajax-Rückruf der Inhalt, den Sie an Ihre "div" anhängen, Skript-Tags enthält, werden diese synchron aufgerufen.
Haitham Sweilem
1

Mein Workabout: Ich verwende asynchrone Anforderungen, um den Code in einen Puffer zu kopieren. Ich habe eine Schleife, die jede Sekunde den Puffer überprüft. Wenn der Speicherauszug im Puffer angekommen ist, führe ich den Code aus. Ich benutze auch eine Auszeit. Für den Endbenutzer funktioniert die Seite so, als würden synchrone Anforderungen verwendet.

Lauf zurück
quelle
Haben Sie einen kleinen Code, damit ich weiß, wie ich das erreichen kann?
ZerOne
5
@runback, kann der Rückruf von done () nicht verwendet werden? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) Hoffe ich habe nichts falsch gelesen.
Pravin
0

Wenn wir das Skript in einer Teilansicht laden, tritt dieses Problem auf

  1. Ich habe das Skript in der Teilansicht entfernt und bin zur Hauptansicht übergegangen.

Diese Lösung funktioniert gut für mich

A.Chandrashekar shekar
quelle