2009-10-02 6 views
5

Jestem przechwytywania zdarzenie window.onbeforeunload stosując następujący kod:„Unknown Exception”, gdy anulowanie stronę rozładunek z „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; 
      } 
     } 

} 

Gdy kliknę „Anuluj” w otrzymanym potwierdzeniu, I pojawia się błąd „Unknown Exception”, a po podświetleniu przez debugger:

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

Jeśli kliknę OK, zmiany stron doskonale. Dlaczego pojawia się ten błąd i jak mogę to naprawić?

Odpowiedz

9

Tak, jest to znane zachowanie IE. Podczas próby nawigacji z JavaScript (przy użyciu lokalizacji, location.href, location.replace, document.location, history, nawet metod ronda takich jak link.click lub form.submit), Anuluj spowoduje zgłoszenie wyjątku. Przypadek testowy jest tak proste, jak:

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

Może to być nawet celowe, aby skrypt wiedzieć próba nawigacja nie powiodła się, z tym, że nazwa błędu jest więc całkowicie bezużyteczne. (I Get „Nieokreślony błąd”).

Tradycyjnym rozwiązaniem jest po prostu, żeby go złapać:

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

zawsze jestem podejrzliwy, że choć jak łapanie wszystkie wyjątków jest na ogół złe wiadomości (ale IE nie pozwala ci tylko złapać tego wyjątku ... brakuje sprawdzenia dokładnego stringTo, który jest okropnie kruchy .

Innym podejściem jest przeniesienie pracy onbeforeunload do kodu wywołującego, tak aby rzeczywisty onbeforeunload nigdy się nie wydarzył i nie ma wyjątku:

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; 
} 

Jednak każde rozwiązanie może być poza twoim zasięgiem, jeśli, jak się wydaje, jest to jakikolwiek framework, którego używasz, który wstawia kod, a nie jest czymś, co sam napisałeś.

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

jaki to rodzaj kontroli? Sam szczerze wygląda na podejrzany: na pewno coś, co klikniesz, aby przejść na inną stronę, powinno być oznaczone jako prosty link, a nie element JavaScript-onclick (te zepsują się na wiele sposobów). Jeśli byłby to prosty link nie-JavaScript, nie musiałbyś się martwić o błąd IE.

Nawiasem mówiąc, twoja funkcja beforeunload prawdopodobnie nie powiedzie się w przeglądarkach innych niż IE (returnValue jest rzeczą tylko IE). Wydaje się też nieco zbyt skomplikowane ... co jest nie tak z:

window.onbeforeunload= function() { 
    if(checkIsDirty()) 
     return 'If you continue your changes will not be saved.'; 
} 
Powiązane problemy