jQuery ha XMLHTTPRequest sincrono deprecato


119

Come molti altri, il mio sito web utilizza jQuery. Quando apro gli strumenti per sviluppatori, vedo un avviso che dice che XMLHTTPRequest è

deprecato a causa dei suoi effetti dannosi per l'esperienza dell'utente finale.

Sono andato avanti e ho letto parte della documentazione , ma era abbastanza tecnica. Qualcuno può spiegare le conseguenze del passaggio da XMLHTTPRequest a WHATWG in termini semplici? Dice che è successo nel 2012.

Inoltre, la documentazione dice che Synchronous XMLHttpRequest al di fuori dei lavoratori è in procinto di essere rimosso dalla piattaforma web, quando ciò accade, se un agente utente li aveva in un servizio, ha bisogno di modificare il codice esistente?


2
Stai parlando di richieste XMLHTTP sincrone, non asincrone, giusto? Le richieste sincrone sono orribili per l'esperienza dell'utente finale (bloccano il browser durante la richiesta) e generalmente non dovrebbero essere utilizzate.
jfriend00

2
fornire un codice che lo
attivi

3
È questo il testo completo in questione? XMLHttpRequest sincrono sul thread principale è deprecato a causa dei suoi effetti negativi sull'esperienza dell'utente finale.
Qantas 94 Heavy

1
jQuery fornisce questo avviso solo per le richieste sincrone, non è vero? Stai facendo deliberatamente una richiesta sincrona? In tal caso, la soluzione è strutturare il codice in modo che funzioni con richieste asincrone, cosa che dovresti comunque fare perché sono molto più belle dal punto di vista dell'utente.
nnnnnn

1
Ho visto quella bandiera non solo nel mio sito web, ma anche in altri, ad esempio Youtube. Per quanto riguarda le specifiche, con quali specifiche dovrebbe essere conforme il mio codice, W3C o WHATWG? , riferimento che non voglio chiedere nel thread principale perché sarebbe contrassegnato come una questione di opinione immagino. @ Qantas94Heavy
Edd

Risposte:


136

Per evitare questo avviso, non utilizzare:

async: false

in una qualsiasi delle tue $.ajax()chiamate. Questa è l'unica caratteristica XMLHttpRequestdeprecata.

L'impostazione predefinita è async: true, quindi se non usi mai questa opzione, il tuo codice dovrebbe essere al sicuro se la funzione viene rimossa davvero.

Tuttavia, probabilmente non lo sarà: potrebbe essere rimosso dagli standard, ma scommetto che i browser continueranno a supportarlo per molti anni. Quindi, se hai davvero bisogno di AJAX sincrono per qualche motivo, puoi usare async: falsee ignorare gli avvisi. Ma ci sono buone ragioni per cui AJAX sincrono è considerato uno stile scadente, quindi probabilmente dovresti cercare di trovare un modo per evitarlo. E le persone che hanno scritto applicazioni Flash probabilmente non avrebbero mai pensato che sarebbero andate via, ma ora è in procinto di essere gradualmente eliminate.

Si noti che l' FetchAPI che sta sostituendo XMLHttpRequestnon offre nemmeno un'opzione sincrona.


9
Questo è l'avvertimento di jQuery quindi. Posso ignorarlo? Non uso chiamate sincrone al server. Il lato perfezionista di me non ama affatto avere avvertimenti.
Jordan

2
@Jordan Penso che l'avviso provenga dal browser, non da jQuery. Accadrà ogni volta che proverai a utilizzare AJAX sincrono. Se usi jQuery, ciò accadrà solo se specifichi tale opzione su $.ajax.
Barmar

2
Sto usando jquery.i18n.properties.jsma non c'è una chiamata esplicita da parte mia a $.ajax.Forse internamente, ma non sono sicuro.
Manuel Jordan

1
Quel plugin carica i bundle di risorse dai .propertiesfile. Probabilmente sta usando AJAX sincrono per farlo, causando questo avviso.
Barmar

1
L'impostazione di @ManuelJordan async: true in i18n può causare un ritardo nella visualizzazione delle stringhe visualizzate nella tua pagina in caso di connessione lenta. Mostrando invece il codice della stringa
Siyon DP

62

La risposta accettata è corretta, ma ho trovato un'altra causa se stai sviluppando in ASP.NET con Visual Studio 2013 o versioni successive e sei sicuro di non aver effettuato alcuna richiesta ajax sincrona o di non aver definito script nel posto sbagliato.

La soluzione è disabilitare la funzione "Browser Link" deselezionando "Enable Browser Link" nel menu a tendina della barra degli strumenti di VS indicato dalla piccola icona di aggiornamento che punta in senso orario. Non appena lo fai e ricarichi la pagina, gli avvisi dovrebbero interrompersi!

Disabilita collegamento browser

Questo dovrebbe accadere solo durante il debug in locale, ma è comunque utile conoscere la causa degli avvisi.


Si può disabilitare web.configaggiungendo <add key="vs:EnableBrowserLink" value="false" />all'interno <appSettings>come descritto qui: poconosystems.com/software-development/… .
Beel

3
Penso che questo sia un cattivo suggerimento solo per ottenere messaggi di avviso nella console. Disabilitare il browserlink e sbarazzarsi dei miglioramenti della produttività aggiunti dal browserlink solo in modo da non vedere un messaggio di avviso nella console del browser? È meglio segnalare un bug con Microsoft e viene risolto.
coding4fun

4
@ coding4fun Grazie per la tua opinione; puoi sentirti libero di segnalare un bug a Microsoft. Non stavo dicendo che dovresti disabilitare il collegamento del browser. La mia risposta è accurata in merito alla causa di questo avviso in alcuni casi ed è utile escludere qualcosa nel tuo codice. Personalmente mi sono sentito meglio una volta che ho capito che non era qualcosa che ho fatto di sbagliato e ho pensato che anche gli altri avrebbero potuto trovarlo utile.
Sam il

Questo ha risolto più del semplice avviso ajax. Ho tutti i tipi di problemi di collegamento del browser nella console JavaScript usando asp core.
JoeBass

Qualcuno sa cos'è il collegamento del browser e perché finisce per dare un simile avvertimento?
gideon

15

Questo è successo a me avendo un collegamento a js esterni all'esterno della testa appena prima della fine della sezione del corpo. Sai, uno di questi:

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

Non aveva nulla a che fare con JQuery.

Probabilmente vedresti lo stesso fare qualcosa del genere:

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

Ma non ho provato quell'idea.


L'avvertimento è scomparso quando ho rimosso una riga come questa, che comunque non stavo usando: @ Html.Script ("~ / scripts / apps / appname.js")
MsTapp

10

È stato menzionato come commento da @ henri-chan , ma penso che meriti un po 'più di attenzione:

Quando aggiorni il contenuto di un elemento con un nuovo html usando jQuery / javascript e questo nuovo html contiene <script>tag, questi vengono eseguiti in modo sincrono e quindi innescano questo errore. Lo stesso vale per i fogli di stile.

Sai che questo accade quando vedi (più) script o fogli di stile caricati come XHRnella finestra della console. (Firefox).


3

Nessuna delle risposte precedenti (che sono tutte corrette) era adatta alla mia situazione: non uso il asyncparametro in jQuery.ajax()e non includo un tag script come parte del contenuto che veniva restituito come:

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

La mia situazione è che sto chiamando due richieste AJAX consecutivamente con l'obiettivo di aggiornare due div contemporaneamente:

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

Quando clicco su a.anchor3, solleva il flag di avviso.Ho risolto il problema sostituendo f2 invocando per click()funzione:

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

5
Gli script non vengono eseguiti se vengono inseriti direttamente nel DOM tramite innerHTML. Quindi, quando chiami .html (), jQuery recupera ed esegue tutti gli script inclusi nella risposta html in modo sincrono.
Henry Chan

@HenryChan, ho cercato di capirti ma senza successo. Potresti spiegarmelo con parole più semplici. Non inserisco script nel DOM, inserisco solo HTML e tuttavia questa soluzione è l'unica soluzione funzionante per me. Grazie in anticipo
Adib Aroui

2
@whitelettersinblankpapers Penso che voglia dire: all'interno del tuo callback ajax, se i contenuti che aggiungi ai tuoi "div" contengono tag di script, questi verranno chiamati in modo sincrono.
Haitham Sweilem

1

Il mio workabout: utilizzo richieste asincrone scaricando il codice in un buffer. Ho un ciclo che controlla il buffer ogni secondo. Quando il dump è arrivato al buffer eseguo il codice. Uso anche un timeout. Per l'utente finale la pagina funziona come se venissero utilizzate richieste sincrone.


hai un po 'di codice per me per sapere come ottenere questo?
ZerOne

5
@runback, non è possibile utilizzare la richiamata della promessa done ()? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) Spero di non aver letto male nulla.
pravin

0

Se carichiamo lo script in visualizzazione parziale, questo problema è in arrivo

  1. Ho rimosso lo script in visualizzazione parziale e sono passato alla visualizzazione principale.

Questa soluzione funziona bene per me

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.