2009-10-02 14 views
5

Sto catturare l'evento window.onbeforeunload utilizzando il seguente codice:"Eccezione sconosciuta" quando si annulla pagina di scaricamento con "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; 
      } 
     } 

} 

Quando clicco 'Annulla' nella conferma risultante, ho ottenere l'errore "Eccezione sconosciuta" e la seguente è evidenziata dal debugger:

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

Se clicco su OK, la pagina cambia perfettamente. Perché ricevo questo errore e come posso risolverlo?

risposta

9

Sì, è un comportamento noto di IE. Quando provi a navigare da JavaScript (utilizzando posizione, location.href, location.replace, document.location, cronologia, persino metodi rotondi come link.click o form.submit), un annullamento beforeunload annulla un'eccezione. Il banco di prova è semplice come:

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

Questo potrebbe anche essere deliberata, di lasciare che lo script conosce il tentativo fallito di navigazione, tranne che il nome errore è così del tutto inutile. (Ottengo “Errore non specificato”.)

La soluzione tradizionale è solo quello di catturarlo:

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

Sono sempre sospettoso di che anche se, come la cattura di tutti i eccezioni è generalmente una cattiva notizia (ma IE non ti permette di catturare solo questa eccezione ... a meno di controllare lo string esatto, che è orribilmente fragile

Un altro approccio è spostare il lavoro onbeforeunload sul codice chiamante in modo che il vero onbeforeunload non avvenga mai e non c'è eccezione:

function navigate(url) { 
    if (window.onbeforeunload) { 
     if (confirm(window.onbeforeunload()+' Press OK to continue, or Cancel to stay on the current page.') 
      window.onbeforeunload= ''; 
     else 
      return; 
    } 
    location.href= url; 
} 

Tuttavia, entrambe le soluzioni potrebbero essere al di là della tua portata se, come sembra probabile, è il framework che stai utilizzando che sta inserendo il codice, piuttosto che essere qualcosa che hai scritto tu stesso.

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

che tipo di controllo è questo? Sembra di per sé sospetto: sicuramente qualcosa su cui fai clic per andare su un'altra pagina dovrebbe essere contrassegnato come un semplice link, e non come un elemento JavaScript-onclick (questi errori vanno in molti modi). Se si trattasse di un semplice collegamento non JavaScript, non dovresti preoccuparti dell'errore di IE.

Per inciso, la funzione beforeunload probabilmente non funzionerà su browser non IE (returnValue è una cosa solo IE). Sembra anche un po 'complicato ... cosa c'è di sbagliato:

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