2010-07-26 11 views
6

Ich habe ein Problem mit Google Chrome oder besser gesagt mit dem Webbrowser Androids (2.1).Ladeanzeige mit Google Chrome

Meine Webapp ruft Resservices mit jeder Seitenverschiebung auf. Das braucht etwas Zeit und ich brauche ein Feedback für den Benutzer wie ein kleines "Arbeiten ..." Popup. Die Restdienste werden mit einer Synchronisations-Ajax-Anforderung aufgerufen. Hier ein Beispiel:

 
$.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' 
}); 

Das funktioniert gut auf FF und Opera! Aber wenn ich meine Webapp auf Chrome oder mit meinem Android Gerät besuche, erscheint der Lade-Indikator nicht! Es scheint, dass der Google-Browser nicht mit synchronen Anfragen arbeitet.

Weiß jemand, wie ich das zur Arbeit bringen kann oder eine andere Lösung weiß, um eine Ladeanzeige in Chrom zu bekommen?

Antwort

8

Die Lösung besteht nicht darin, synchrone Anforderungen zu verwenden. Im Allgemeinen sollten synchrone Anfragen niemals verwendet werden, da sie dazu neigen, die Ausführung von irgendetwas anderem auf der Seite (oder sogar der gesamten Browser-UI) zu blockieren, was nicht gut ist.

+0

Ich würde sehr gerne einen Grund für den Downvote hören. –

+0

Ok, dein Recht. Aber das ist die Architektur im Moment und ich kann sie in naher Zukunft nicht ändern. :/ – bedit

+0

Zu sagen, dass synchrone Anfragen "nie" verwendet werden sollten, ist eine ziemlich fette Aussage. Es erfordert eine viel bessere Erklärung als "sie neigen dazu, Dinge zu blockieren". Was blockieren sie? Wie würden Nutzer ihren Standort als Lesezeichen speichern, wenn alles in Ihrer App asynchron ist? –

3

Sie sagen, dass der Ladeindikator nicht auch auf Google Chrome (Desktop) oder nur auf dem mobilen Google Chrome Lite-Browser für Android-Geräte angezeigt wird? Wenn Sie die neueste Version von jQuery verwenden, sollte es auf allen Desktop-Browsern funktionieren. Mobile Browser werden aufgrund ihres stark abweichenden Schnittstellendesigns nicht gut unterstützt. Da sie keine vollwertigen Browser sind, verfügen viele nicht über eine voll funktionsfähige JS-Unterstützung.

Das sagte, ich habe noch keine Probleme mit jQuery in Chrome Lite — eines der beeindruckendsten Dinge über die Android-Plattform gehört die Aufnahme eines voll funktionsfähigen Browsers auf einer mobilen Plattform. Aber ich denke, es gibt eine mobile Version von jQuery entweder verfügbar oder in Arbeit. Wenn alles andere fehlschlägt, könnten Sie das versuchen.

Für einen Überblick über JavaScript/jQuery Unterstützung auf mobilen Browsern finden Sie in diesem Google Groups Beitrag: http://groups.google.com/group/jquery-dev/msg/262fa7d9f3cbe96e

Edit: Während Chrome UI zu sperren scheint, während Sie eine synchrone Anfrage Leistung erbringt, ich konnte daran vorbei, indem man einfach eine leichte Verzögerung zwischen der Anzeige des Ladeanzeige setzen und Durchführung des 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; 
} 

ich eine POST-Anforderung verwendet, um den Browser zu verhindern, Caching der Antwort, b Das sollte aber genauso gut mit get-Anfragen funktionieren. Ich habe kein Android-Handy, um es zu testen, aber es funktioniert gut in Google Chrome.

+0

Ja, der Indikator wird nicht auf dem Google Chrome-Desktop und auf dem Android-Gerät angezeigt. Ich benutze Version 1.4.2 von jQuery. Vielleicht spiele ich mit jQTouch ... – bedit

+0

@benjamin: Versuchen Sie eine Verzögerung zwischen dem Anzeigen der Ladeanzeige und Starten der synchronen XHR. –

+0

Hi Lèse, es funktioniert mit der Zeitüberschreitung !! Danke für deine große Mühe !! Ich kann Ihnen keine Stimme geben, denn ich brauche zuerst 15 Ruf! :/ – bedit