2009-05-15 10 views
3

Ceci est l'intestin de mon appel ajax.Jquery erreur ajax ambigu

function ajax(path, requestData, successCallBack, errorCallBack) { 
    return $.ajax({ 
     error: function(xhr, textStatus, errorThrown) 
      ç(xhr, textStatus, errorThrown); 
     }, 
     success: function(json){ 
      successCallBack(json); 
     } 
    }); 
} 

Quand il y a un appel ajax passe et l'utilisateur clique sur un lien sur la page, mon errorCallback est invoquée. L'utilisateur naviguant à l'extérieur provoquerait la suppression de l'appel ajax. En cas d'erreur sur le serveur, mon callback errorCallBack est également appelé.

Existe-t-il un moyen de différencier les deux?

Merci!

Répondre

-1

Vérifiez les propriétés de l'objet xhr. Il devrait avoir le code de réponse HTTP quelque part.

1

J'ai eu le même problème avec quelque chose sur lequel je travaillais ... Une requête $ .ajax 'annulée' (l'utilisateur quitte/stoppe) xhr.status == 0 au lieu de 200/404/etc ...

+2

Cela ne ferait pas la différence entre un utilisateur naviguant loin et un serveur complètement inaccessible, cependant. Je ne pense pas que ça fonctionne. –

1

Voici est la technique que je l'habitude de mettre en œuvre des années Gnarf et les réponses de nickf:

jQuery jette l'événement d'erreur lorsque l'utilisateur quitte la page soit en actualisant, en cliquant sur un lien, ou changer l'URL dans le navigateur. Vous pouvez détecter ces types d'erreurs par la mise en œuvre par un gestionnaire d'erreur pour l'appel ajax et inspecter l'objet xmlHttpRequest:

$.ajax({ 
    /* ajax options omitted */ 
    error: function (xmlHttpRequest, textStatus, errorThrown) { 
     if(xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0) 
       return; // it's not really an error 
     else 
       // Do normal error handling 
}); 
3

@ réponse de colbeerhey est bonne, mais vous pouvez aller un peu plus loin. Vous devez toujours savoir si le serveur est réellement inaccessible. Je pose cette question here, mais la réponse complète est:

var running = true; 
$(window).bind('beforeunload', function() { running = false; }); 

$.ajax({ 
    /* ajax options omitted */ 
    error: function (xmlHttpRequest, textStatus, errorThrown) { 
     var serverNotReached = xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0; 
     if(serverNotReached && !running) 
       return; // it's not really an error, user clicked away 
     else if (serverNotReached) 
       // The server is down! You didn't get any response at all. 
     else 
       // Do normal error handling 
}); 

Gardez à l'esprit que OnBeforeUnload n'est vraiment une norme de facto (IE FF, Webkit tout manipuler) donc cela cassera si vous vous souciez plus obscur navigateurs.