31 votes

L'indicateur de chargement de Chrome continue de tourner pendant XMLHttpRequest

J'écris une application Web AJAX qui utilise Comet / Long Polling pour maintenir la page Web à jour, et j'ai remarqué dans Chrome, qu'elle traite la page comme si elle était toujours en cours de chargement (l'icône de l'onglet continue de tourner).

Je pensais que c'était normal pour Google Chrome + Ajax car même Google Wave avait ce comportement.

Eh bien aujourd'hui, j'ai remarqué que Google Wave ne fait plus tourner l'icône de chargement, quelqu'un sait-il comment cela a été résolu?

Voici mon code d'appel ajax

 var xmlHttpReq = false;
// Mozilla/Safari
if (window.XMLHttpRequest) {
   xmlHttpReq = new XMLHttpRequest();
}
// IE
else if (window.ActiveXObject) {
   xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttpReq.open('GET', myURL, true);
xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlHttpReq.onreadystatechange = function() {
   if (xmlHttpReq.readyState == 4) {
      updatePage(xmlHttpReq.responseText);
   }
}
xmlHttpReq.send(null);
 

36voto

Marcel Korpel Points 14633

J'ai sans vergogne a volé Oleg de cas de test et ajusté un peu pour simuler le long du scrutin.

load.html:

<!DOCTYPE html>
<head>
  <title>Demonstration of the jQery.load problem</title>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script>
  jQuery(document).ready(function() {
    $('#main').load("test.php");
  });
  </script>
</head>
<body>
  <div id='main'></div>
</body>
</html>

test.php:

<?php
  sleep(5);
?>
<b>OK!</b>

Le résultat est intéressant: dans Firefox et Opera, aucun indicateur de chargement s'affiche lors d'XMLHTTPRequests. Chrome permet de filer... je soupçonne Google Wave n'utilisez pas le temps d'interrogation (mais, par exemple, les sondages de toutes les X secondes, afin d'économiser des ressources), mais je ne peux pas le tester, car je n'ai pas de compte.

EDIT: Et j'ai tout compris: après avoir ajouté un peu de retard dans le chargement test.php, qui peut être aussi petit que possible, l'indicateur de chargement s'arrête après l' load.html a été chargé:

jQuery(document).ready(function() {
  setTimeout(function () {
    $('#main').load("test.php");
  }, 0);
});

En quelque sorte, comme cela est confirmé dans un commentaire sur une autre réponse, lorsque le navigateur obtient le contrôle de retour pour terminer le rendu de la page, le voyant s'arrête de tourner. Un autre avantage est que la demande ne peut être interrompu en appuyant sur la touche Echap.

2voto

Oleg Points 136406

Désolé pour ma réponse générale, mais si vous voulez avoir un programme plus indépendant du navigateur, vous devez utiliser jQuery ou autre de votre bibliothèque préférée au lieu de bas niveau XMLHttpRequest et ActiveXObject("Microsoft.XMLHTTP").

MODIFIÉ: J'ai créer deux très simples fichiers HTML: test.htm et load.htm et il est alors placé dans le même répertoire sur un site web (essayez cette URL http://www.ok-soft-gmbh.com/jQuery/load/load.htm). Je ne peux pas voir l'effet que vous avez décrit dans votre question. Comparez cela avec les fichiers d'exemples et vous permettra de résoudre votre problème.

load.htm:

<!DOCTYPE html PUBLIC
          "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head">
  <title>Demonstration of the jQery.load problem</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script type="text/javascript">
  jQuery(document).ready(function() {
    $('#main').load("test.htm");
  });
  </script>
</head>

<body>
  <div id='main'></div>
</body>
</html>

test.htm:

<b>OK!</b>

-3voto

cosy Points 238

utiliser cette fonction

 function getHTTPObject() {
 var xhr = false;
 if (window.XMLHttpRequest) {
  xhr = new XMLHttpRequest();
 } else if (window.ActiveXObject) {
  try {
   xhr = new ActiveXObject("Msxml2.XMLHTTP");
  } catch(e) {
   try {
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
   } catch(e) {
    xhr = false;
   };
  };
 };
 return xhr;
};
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X