2009-11-18 4 views
1

J'essaye de faire un appel JSONP à un serveur sur l'événement 'beforeunload'. Tout cela fonctionne bien jusqu'à ce que je commence à jouer avec le bouton de retour. Si je navagate loin de la page et que j'appuie sur 'retour' la prochaine fois que l'événement beforeunload est appelé, il apparaît qu'il fait la requête JSONP mais le serveur ne la reçoit jamais.JSONP + onbeforeunload + bouton Précédent + Problèmes

Note (1): Ceci a été testé sur IE et FF (problème apparaissant sur les deux).

Note (2): J'ai aussi testé en utilisant la méthode jQuery.getJSON et j'ai eu le même problème donc je suppose que la fonction makeJSONPCall est correcte. (Je peux me tromper)

Des idées pour quelqu'un?

Une partie du code pour le contexte:

JSONP APPEL:

makeJSONPCall('http://serverurl.mvc/method?args=' + data, 'callbackfunction');  

function makeJSONPCall(url, callbackname) 
{     
    if (url.indexOf("?") > -1) url += "&jsonp=" 
    else url += "?jsonp=" 
    url += callbackname + "&"; 
    url += new Date().getTime(); 
    var script = document.createElement("script");    
    script.setAttribute("id", "JSONP"); 
    script.setAttribute("src",url); 
    script.setAttribute("type","text/javascript");     
    if (document.head) document.head.appendChild(script); 
    else document.body.appendChild(script);  
} 

Merci

Répondre

0

Cet événement est une sorte de bizarre. Vous pourriez finalement décider de ne pas l'utiliser. Première chose, assurez-vous que vous faites un poste synchrone. Ensuite, vous devrez probablement présenter une interface utilisateur à l'utilisateur afin d'empêcher le navigateur de changer d'emplacement trop rapidement. J'ai utilisé quelque chose comme le ci-dessous une fois et cela a fonctionné mais j'ai fini par faire les choses différemment.

window.onbeforeunload = function() { 
       // stuff do do before the window is unloaded here. 
       if(IsDirty()) { 
      //i only want to call ajax if I need to. 
       setTimeout(function(){ 
        DoAjaxSaveSynchronously(); // this was important 
        ClearDirty(); 
         }, 500); 
//this return value causes the browser to pop a modal window. 
       return "You have unsaved work. Please stay on this page to save your work."; 
       } 
      } 
+0

Merci pour la réponse rapide Chris. Malheureusement, étant un script d'utilité publique, je ne peux pas aller mettre des alertes dans les pages des peuples. Je ne pense pas qu'il y ait une solution ici car il n'y a aucun moyen pour moi d'attendre dans l'événement beforeunload jusqu'à ce que je reçoive la réponse du serveur. Merci quand même – gatapia

0

Je travaille sur un problème similaire - Je dois envoyer des données en réponse à l'utilisateur de quitter un site et mon code est là comme une ressource externe dans la page de quelqu'un. Je ne peux pas faire de popup et je dois faire l'appel. Et je dois utiliser JSONP qui ne peut pas être synchrone.

Ce que j'ai pu comprendre est:

  • gestionnaire onbeforeunload bloque le navigateur de détruire la page en cours
  • si vous ne retournez pas quoi que ce soit, le menu contextuel ne semble pas.

Votre code fonctionnera donc tant que le gestionnaire d'événements s'exécutera.

pseudocode:

window.onbeforeunload = function() { 
    startAsynchronousSending(); 
    //do lots of slow and synchronous stuff to delay destroying the window// 
    //return statement deliberately missing 
} 

Au moment où il travaille déjà pour moi, mais la partie de retard est juste une boucle CPU intensive. Cela fait une différence (il y a assez de temps pour que la demande soit envoyée) mais je cherche un meilleur délai.

Voir aussi: http://forums.thedailywtf.com/forums/t/24374.aspx

Je vous serais reconnaissant de commentaires avec des idées sur ce qu'il faut mettre dans la boucle.Je prends quelques options en compte:

  • perdre CPU sur les mathématiques viennent sur un grand nombre
  • accès localStorage (appel synchrone, opération IO)
  • accès DOM
  • appel synchrone ajax (mais je n » t vouloir inclure le code pour ajax dans un script qui ne l'utilise pas)

Des idées?

Questions connexes