2009-10-02 6 views
5

je capture l'événement window.onbeforeunload en utilisant le code suivant:« Exception inconnue » lors de l'annulation de déchargement avec « location.href »

window.onbeforeunload = function (evt) 
{ 

    if(checkIsDirty()) 
     { 
      var message = 'If you continue your changes will not be saved.'; 
      if (typeof evt == 'undefined') 
      { 
       //IE 
       evt = window.event; 
      } 
      if (evt) 
      { 
       evt.returnValue = message; 
      } 
      else 
      { 
       return message; 
      } 
     } 

} 

Lorsque je clique sur « Annuler » dans la confirmation obtenue, je obtenir l'erreur « Exception inconnue » et ce qui suit est mis en évidence par le débogueur:

onclick="location.href='/<WhicheverPageYouRequested>.aspx'; 

Si je clique sur OK, la page change parfaitement. Pourquoi ai-je cette erreur et comment puis-je la réparer?

Répondre

9

Oui, c'est un comportement IE connu. Lorsque vous essayez de naviguer à partir de JavaScript (en utilisant location, location.href, location.replace, document.location, history, même des méthodes de type roundabout comme link.click ou form.submit), un beforeunload Cancel lèvera une exception. Le cas de test est aussi simple que:

window.onbeforeunload= function() { return '?'; } 
location.href= 'http://www.example.com/'; 

Cela pourrait même être délibérée, de laisser le script savoir la tentative de navigation a échoué, sauf que le nom d'erreur est si complètement inutile. (Je reçois « erreur non spécifiée ».)

La solution traditionnelle est juste pour l'attraper:

try { 
    location.href= '...'; 
} catch(e) {} 

Je suis toujours méfiant de ce bien que la capture toutes exceptions est généralement mauvaises nouvelles (mais IE ne vous permet pas seulement d'attraper cette exception ... à moins de vérifier la chaîne exacteTo, qui est horriblement fragile

Une autre approche consiste à déplacer le travail onbeforeunload vers le code appelant afin que le réel ne se produise jamais et il n'y a aucune exception:

Cependant l'une ou l'autre des solutions peut vous échapper si, comme vous le voyez, c'est le framework que vous utilisez qui insère le code, plutôt que ce que vous avez écrit vous-même.

onclick="location.href='/<WhicheverPageYouRequested>.aspx'"; 

quel type de contrôle est-ce? Il semble suspect en soi pour être honnête: sur quelque chose que vous cliquiez sur pour aller à une autre page devrait être marqué comme un simple lien, et pas un élément JavaScript-onclick (ils vont mal à bien des égards). S'il s'agissait d'un simple lien non-JavaScript, vous n'avez pas à vous soucier de l'erreur IE. Par ailleurs, votre fonction beforeunload échouera probablement sur les navigateurs non-IE (returnValue est une chose uniquement IE). Il semble également un peu trop compliqué ... quel est le problème avec:

window.onbeforeunload= function() { 
    if(checkIsDirty()) 
     return 'If you continue your changes will not be saved.'; 
} 
Questions connexes