2010-07-26 18 views
6

Tengo un problema con Google Chrome o más bien con el navegador web Androids (2.1).Indicador de carga con Google Chrome

Mi webapp llama a restservices con cada cambio de página. Esto lleva tiempo y necesito una retroalimentación para el usuario como un pequeño mensaje emergente de "trabajo ...". Los servicios de reposo son llamados con una solicitud de sincronización de ajax. He aquí un ejemplo:

 
$.ajax({ 
    url: some URI, 
    async: false, 
    beforeSend: function() { 
     showIndicatorDialog(); 
    }, 
    complete: function() { 
     hideIndicatorDialog(); 
    }, 
    success: function(response) { 
     do something after success; 
    }, 
    error: function(response) { 
     do something after error; 
    }, 
    type: 'GET' 
}); 

grandes obras que en FF y Opera! ¡Pero cuando visito mi aplicación web en Chrome oder con mi dispositivo Android, el indicador de carga no aparece! Parece que el buscador de Google no funciona con solicitudes sincrónicas.

¿Alguien sabe cómo puedo hacer que esto funcione o conoce otra solución para obtener un indicador de carga en cromo?

Respuesta

8

La solución es no utilizar solicitudes sincrónicas. En general, las solicitudes síncronas deben nunca utilizarse porque tienden a bloquear la ejecución de cualquier otra cosa en la página (o incluso la interfaz de usuario del navegador completo), lo cual no es bueno.

+0

Me gustaría mucho escuchar un motivo para la votación negativa. –

+0

Ok, a su derecha. Pero esa es la arquitectura en este momento y no puedo cambiarla en el futuro cercano. :/ – bedit

+0

Decir que las solicitudes sincrónicas "nunca" deben usarse es una afirmación bastante audaz. Requiere una explicación mucho mejor que "tienden a bloquear cosas". ¿Qué bloquean? ¿Cómo marcarán los usuarios su ubicación como favoritos si todo en su aplicación es asincrónico? –

3

¿Está diciendo que el indicador de carga tampoco aparece en Google Chrome (computadora de escritorio) o solo en el navegador móvil Google Chrome Lite para dispositivos Android? Si está utilizando la última versión de jQuery, debería funcionar en todos los navegadores de escritorio. Los navegadores móviles no cuentan con un buen soporte debido a su diseño de interfaz drásticamente diferente y, al no ser navegadores completos, muchos no tienen soporte JS totalmente funcional.

Dicho esto, no he oído hablar de ningún problema con jQuery en Chrome Lite — una de las cosas más impresionantes de la plataforma Android es la inclusión de un navegador totalmente funcional en una plataforma móvil. Pero creo que hay una versión móvil de jQuery disponible o en proceso. Entonces, si todo lo demás falla, podrías intentarlo.

Para un resumen de JavaScript/jQuery en los navegadores móviles, ven esto de Grupos de Google mensaje: http://groups.google.com/group/jquery-dev/msg/262fa7d9f3cbe96e

Editar: Mientras que la interfaz de usuario de Chrome parece bloquearse mientras se está realizando una petición síncrona, yo era capaz de superar esto simplemente poniendo un ligero retraso entre mostrar el indicador de carga y realizar la XHR:

function callAjax() { 
    showIndicatorDialog(); 
    setTimeout("testAjax()",100); 
} 
function testAjax() { 
    foo = $.ajax({ 
     url: "index4.htm", 
     global: false, 
     type: "POST", 
     data: { 
      id: 3 
     }, 
     dataType: "html", 
     async:false, 
     success: function(msg){ 
      $('#response').text(msg); 
     }, 
     complete: hideIndicatorDialog 
    }).responseText; 
} 

utilicé una solicitud POST para impedir que el navegador el almacenamiento en caché la respuesta, b Pero esto debería funcionar igual de bien con las solicitudes de obtención. No tengo un teléfono con Android para probarlo, pero funciona bien en Google Chrome.

+0

Sí, el indicador no aparece en el escritorio de Google Chrome y en el dispositivo Android. Uso la versión 1.4.2 de jQuery. Tal vez jugar con jQTouch ... – bedit

+0

@benjamin: Trate de poner un retraso entre mostrar el indicador de carga y el lanzamiento de la XHR síncrona. –

+0

¡Hola Lèse, funciona con el tiempo de espera! ¡Gracias por tu gran esfuerzo! ¡No puedo darle un voto porque primero necesito 15 reputaciones! :/ – bedit