jQuery ha desaprobado XMLHTTPRequest sincrónico

119

Como muchos otros, mi sitio web usa jQuery. Cuando abro las herramientas de desarrollo, veo una advertencia que dice que XMLHTTPRequest es

en desuso debido a sus efectos perjudiciales para la experiencia del usuario final.

Continué y leí parte de la documentación , pero era bastante técnica. ¿Alguien puede explicar las consecuencias de cambiar de XMLHTTPRequest a WHATWG en términos simples? Dice que sucedió en 2012.

Además, la documentación dice que Synchronous XMLHttpRequest fuera de los trabajadores está en proceso de ser eliminado de la plataforma web, cuando eso sucede, si un agente de usuario los tenía en un servicio, ¿necesitan modificar su código existente?

Edd
fuente
2
Debe estar hablando de XMLHTTPRequests sincrónicas, no asincrónicas, ¿correcto? Las solicitudes sincrónicas son horribles para la experiencia del usuario final (bloquean el navegador durante la solicitud) y, por lo general, no deben usarse.
jfriend00
2
proporcione algún código que
active
3
¿Es este el texto completo en cuestión? XMLHttpRequest sincrónico en el subproceso principal está en desuso debido a sus efectos perjudiciales para la experiencia del usuario final.
Qantas 94 Heavy
1
jQuery solo da esa advertencia para solicitudes sincrónicas, ¿no es así? ¿Está haciendo deliberadamente una solicitud sincrónica? Si es así, la solución es estructurar su código para que funcione con solicitudes asincrónicas, lo que debería hacer de todos modos porque son mucho más agradables desde el punto de vista del usuario.
nnnnnn
1
He visto esa bandera no solo en mi sitio web, también la he visto en otras, por ejemplo, Youtube. Con respecto a las especificaciones, ¿con qué especificación debería cumplir mi código, W3C o WHATWG? , referencia que no quiero preguntar en el hilo principal porque se marcaría como una cuestión de opinión, supongo. @ Qantas94Heavy
Edd

Respuestas:

136

Para evitar esta advertencia, no utilice:

async: false

en cualquiera de sus $.ajax()llamadas. Esta es la única característica XMLHttpRequestque está obsoleta.

El valor predeterminado es async: true, por lo que si nunca usa esta opción, su código debería ser seguro si la función se elimina realmente.

Sin embargo, probablemente no lo será; puede que se elimine de los estándares, pero apuesto a que los navegadores continuarán admitiéndolo durante muchos años. Entonces, si realmente necesita AJAX sincrónico por alguna razón, puede usar async: falsee ignorar las advertencias. Pero hay buenas razones por las que AJAX sincrónico se considera de mal estilo, por lo que probablemente debería intentar encontrar una manera de evitarlo. Y las personas que escribieron aplicaciones Flash probablemente nunca pensaron que desaparecería tampoco, pero ahora está en proceso de ser eliminado.

Tenga en cuenta que la FetchAPI que está reemplazando XMLHttpRequestni siquiera ofrece una opción sincrónica.

Barmar
fuente
9
Entonces esta es la advertencia de jQuery. ¿Puedo ignorarlo? No utilizo llamadas sincrónicas al servidor. A mi lado perfeccionista no le gusta tener advertencias en absoluto.
Jordania
2
@Jordan Creo que la advertencia proviene del navegador, no de jQuery. Sucederá siempre que intente utilizar AJAX sincrónico. Si usa jQuery, eso solo sucederá si especifica esa opción a $.ajax.
Barmar
2
Estoy usando jquery.i18n.properties.jspero no hay una llamada explícita de mi lado a $.ajax.Quizás internamente, pero no estoy seguro.
Manuel Jordan
1
Ese complemento carga paquetes de recursos de .propertiesarchivos. Probablemente esté usando AJAX síncrono para hacerlo, lo que genera esta advertencia.
Barmar
1
La configuración de @ManuelJordan async: true en i18n puede causar una demora en mostrar las cadenas que se muestran en su página en una conexión lenta. Mostrando en su lugar el código de cadena
Siyon DP
62

La respuesta aceptada es correcta, pero encontré otra causa si está desarrollando bajo ASP.NET con Visual Studio 2013 o superior y está seguro de que no realizó ninguna solicitud ajax síncrona ni definió ningún script en el lugar incorrecto.

La solución es desactivar la función "Enlace del navegador" desmarcando "Activar enlace del navegador" en el menú desplegable de la barra de herramientas VS indicado por el pequeño icono de actualización que apunta en el sentido de las agujas del reloj. Tan pronto como haga esto y vuelva a cargar la página, ¡las advertencias deberían detenerse!

Deshabilitar el enlace del navegador

Esto solo debería suceder durante la depuración local, pero es bueno saber la causa de las advertencias.

Sam
fuente
Uno puede deshabilitarlo web.configagregando <add key="vs:EnableBrowserLink" value="false" />adentro <appSettings>como se describe aquí: poconosystems.com/software-development/… .
Beel
3
Creo que esta es una mala sugerencia solo para recibir mensajes de advertencia en la consola. ¿Deshabilitar el enlace del navegador y deshacerse de las mejoras de productividad que agrega el enlace del navegador para que no vea un mensaje de advertencia en la consola del navegador? Es mejor enviar un error a Microsoft y se soluciona.
coding4fun
4
@ coding4fun Gracias por tu opinión; no dude en presentar un error a Microsoft. No estaba diciendo que debieras deshabilitar el enlace del navegador. Mi respuesta es precisa en cuanto a la causa de esta advertencia en algunos casos y es útil descartar algo en su propio código. Personalmente, me sentí mejor una vez que me di cuenta de que no era algo que hice mal y pensé que otros también podrían encontrarlo útil.
Sam
Esto solucionó más que solo la advertencia de ajax. Obtuve todo tipo de líos en los enlaces del navegador en la consola javascript usando asp core.
JoeBass
¿Alguien sabría qué es el enlace del navegador y por qué termina dando tal advertencia?
gideon
15

Esto me sucedió al tener un enlace a js externos fuera de la cabeza justo antes del final de la sección del cuerpo. Ya sabes, uno de estos:

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

No tuvo nada que ver con JQuery.

Probablemente vería lo mismo haciendo algo como esto:

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

Pero no he probado esa idea.

Dave amigo
fuente
La advertencia desapareció para mí cuando eliminé una línea como esta, que de todos modos no estaba usando: @ Html.Script ("~ / scripts / apps / appname.js")
MsTapp
10

Fue mencionado como un comentario por @ henri-chan , pero creo que merece más atención:

Cuando actualiza el contenido de un elemento con un nuevo html usando jQuery / javascript, y este nuevo html contiene <script>etiquetas, estas se ejecutan sincrónicamente y, por lo tanto, desencadenan este error. Lo mismo ocurre con las hojas de estilo.

Usted sabe que esto está sucediendo cuando ve (múltiples) scripts u hojas de estilo cargados como XHRen la ventana de la consola. (Firefox).

Hugo Delsing
fuente
3

Ninguna de las respuestas anteriores (que son correctas) se adaptaba a mi situación: no uso el asyncparámetro jQuery.ajax()y no incluyo una etiqueta de secuencia de comandos como parte del contenido que se estaba devolviendo como:

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

Mi situación es que estoy llamando a dos solicitudes AJAX consecutivamente con el objetivo de actualizar dos divs al mismo tiempo:

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

Cuando hago clic en a.anchor3, se levanta la bandera de advertencia. Resolví el problema reemplazando la invocación de f2 por click()función:

function anchor_problem(){
$('a.anchor_problem').click(function(){
     f1();
     $('a.anchor_f2').click();
});
}
Adib Aroui
fuente
5
Los scripts no se ejecutan si los inserta directamente en el DOM a través de innerHTML. Entonces, cuando llama a .html (), jQuery recupera y ejecuta cualquier script incluido en la respuesta html de forma sincrónica.
Henry Chan
@HenryChan, traté de entenderte pero fue en vano. ¿Podría explicarme con palabras más sencillas? No inserto scripts en el DOM, solo inserto HTML y aún así esta solución es la única solución que funciona para mí. Gracias de antemano
Adib Aroui
2
@whitelettersinblankpapers Creo que quiere decir: dentro de su devolución de llamada ajax, si el contenido que agrega a sus "div" contienen etiquetas de script, entonces se llamarán sincrónicamente.
Haitham Sweilem
1

Mi problema: utilizo solicitudes asincrónicas que descargan el código en un búfer. Tengo un bucle comprobando el búfer cada segundo. Cuando el volcado ha llegado al búfer, ejecuto el código. También utilizo un tiempo de espera. Para el usuario final, la página funciona como si se utilizaran solicitudes sincrónicas.

atropello
fuente
¿tienes un pequeño código para que sepa cómo lograr esto?
ZerOne
5
@runback, ¿no se puede usar la devolución de llamada de la promesa done ()? $.ajax({ url : "example.com", async : true /* default is true */ }).done(function(response){ // Process the dump }) Espero no haber leído nada mal.
pravin
0

Si cargamos el script en vista parcial, entonces este problema vendrá

  1. Eliminé el script en la vista parcial y pasé a la vista principal.

Esta solución funciona bien para mí

A. Chandrashekar shekar
fuente