2010-09-15 4 views
2

Sur mon site Web, j'utilise une fonction jquery ajax longue interrogation. Cet appel ajax dans cette fonction a un délai de 50 secondes, puis s'exécute à nouveau, en attente de modifications sur le serveur. Toutefois, la connexion http à interrogation longue s'arrête parfois. Cela se produit par exemple lorsque la connexion Internet est coupée ou lorsque le PC client est allumé après la mise en veille ou en veille prolongée. Le problème avec ceci est que le rappel "complet" ne se produit pas encore, la fonction $ .ajax() attend toujours le délai, alors que la connexion http n'existe plus.Vérifier si une connexion d'appel ajax/http est active

Comment vérifier avec jquery/javascript si la connexion est toujours ouverte?

Ceci est mon long script Poller:

function longPoller() { 

    $.ajax({ 
     type: "GET", 
     url: '/longpolltest2.php', 
     dataType: 'json', 
     async: true, 
     cache: false, 
     timeout:50000, /* Timeout in ms */ 

     success: function(data){ 

      alert('success'); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 

      alert('error'); 
     }, 

     complete: function() { 

      alert('complete'); 
      longPoller(); // restart long poller request 
      } 

    }); 
} 

@jAndy, j'ai mis à jour le script, mais je reçois l'erreur suivante:

Permission refusée à http://domain.com pour créer wrapper pour objet de classe UnnamedClass

function masterLongPollerDebugger() { 

    xhr = $.ajax({ 
     type: "GET", 
     url: '/longpolltest2.php', 
     dataType: 'json', 
     async: true, 
     cache: false, 
     timeout:50000, 

     success: function(data){ 

      alert('success'); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown){ 

      alert('error'); 
     }, 

     complete: function() { 

      alert('complete'); 
      masterLongPollerDebugger(); 
      } 

    }); 
} 


function ajaxRunning() { 

    xhr._onreadystatechange = xhr.onreadystatechange; // store a reference 

    xhr.onreadystatechange = function() 
    { // overwrite the handler 
     xhr._onreadystatechange(); // call the original stored handler 
     alert(xhr.readyState); 
     if (xhr.readyState === 3) 
      alert('Interactive'); 
    }; 
} 

Répondre

2

Vous devez vérifier le mode XHR readyState 3 (interactif).

longpolltest2.php doit envoyer une sorte de "ping data" à votre client (avec un intervalle de 10 secondes par exemple). Les données qui ont été reçues avant que le readyState 4 ait été déclenché s'appellent interactive et le XMLHttpRequest déclenche un onreadystatechange avec le readyState défini sur 3.

Ceci a quelques restrictions. IE < 8 ne le prend pas en charge, 8 le prend en charge sur l'objet XDomainRequest. Certains autres navigateurs peuvent avoir besoin d'un "prélude" de données avant de déclencher un readyState 3.

Autre chose à noter: jQuery ne supporte actuellement pas un interactive mode (probablement parce qu'il est loin d'être compatible avec plusieurs navigateurs).

Quoi qu'il en soit, il y a une petite solution de cette question:

var xhr = $.ajax(...); 

xhr._onreadystatechange = xhr.onreadystatechange; // store a reference 

xhr.onreadystatechange = function() { // overwrite the handler 
    xhr._onreadystatechange(); // call the original stored handler 
    if (xhr.readyState === 3) alert('Interactive'); 
}; 
+0

J'ai mis à jour le message original pour plus d'informations. Je reçois une erreur: ** Permission refusée à http://domain.com de créer un wrapper pour l'objet de classe UnnamedClass ** – koen

0

essayer d'utiliser

$(document).ready(function(){ 
    SetInterval(function(){ longPoller() }, 50000); 
}); 
+0

Ce n'est pas une réponse à ma question ... Je l'ai enlevé le SetInterval code pour causer moins de confusion. – koen

0

Vous pouvez essayer quelque chose comme ceci:

(function checkAjax() { 
    setTimeout(function() { 
     if ($.active === 0) { 
      alert('Should restart long polling now :-)'); 
     } else { 
      checkAjax(); 
     } 
    }, 500); 
}()); 
Questions connexes