2012-03-27 18 views
5

Ich arbeite an einer Unternehmensanwendung, wo Formulare dynamisch generiert werden und wir keine Kontrolle über den Code haben. Die meisten Bedienelemente in Form haben folgenden Code zugeordnetonbeforeunload - an selektive Ereignisse binden

<select name="s_10_1_1_0" onchange = 'SWESubmitForm(document.SWEForm10_0,s_5,"","1-E0RHB7")' id='s_10_1_1_0' tabindex=1997 > 

<input type="text" name='s_10_1_11_0' value='' onchange = 'SWESubmitForm(document.SWEForm10_0,s_7,"","1-E0RHB7")' id='s_10_1_11_0' tabindex=1997 maxlength="30"> 

Wir möchten ein ok abbrechen Dialog präsentieren, wenn der Benutzer versucht, auf eine andere Seite über den Link in der Kopf- oder Fußzeile zu navigieren.

Ich habe den folgenden Code verwendet, um onbeforeunload-Ereignis zu binden und dem Benutzer ein OK-Abbrechen-Dialog zu präsentieren.

//this identifies the unique page name 
var viewName = $('input[name="SWEView"]').val(); 
// if I am on desired page bind the event so that now dialog is presented to user 
if(viewName == "XRX eCustomer Create Service Request View"){ 
    $(window).bind('beforeunload', function(){ 
    return 'Your Inquiry has not been submitted yet.'; 
}); 
} 

Aber das Problem ist, dass dieser Dialog bei jedem Benutzerwechsel in Form Wert eines Feldes kommt (ich glaube, dass für OnChange Ereignis SWESubmitForm Code vorhanden zurückzuführen ist).

Ich möchte onbeforeloadload Dialog zu kommen, wenn Benutzer auf einen anderen Link außerhalb Formular klicken oder mit anderen Worten binden onbeforeunload zu selektiven Ereignissen (einschließlich Schließen des Fensters) auf der Seite.

Bitte Hilfe

Antwort

6

.onbeforeunload() global ist. Sie können es nicht auslösen, wenn Sie nur die Seite verlassen möchten. Wenn der Event-Handler installiert ist, wird er ausgelöst, egal wie der Betrachter die Seite verlässt.

Sie können Ihren eigenen internen Status verfolgen und entscheiden, ob Sie irgendetwas im Handler onbeforeunload() eingeben oder einfach nichts zurückgeben (es wird also keine Eingabeaufforderung gemacht).

So könnten Sie Code wie dieses:

//this identifies the unique page name 
var viewName = $('input[name="SWEView"]').val(); 
// if I am on desired page bind the event so that now dialog is presented to user 
if(viewName == "XRX eCustomer Create Service Request View"){ 
    $(window).bind('beforeunload', function() { 
     // figure out whether you need to prompt or not 
     if (myStateSaysToPrompt) { 
      return 'Your Inquiry has not been submitted yet.'; 
     } else { 
      return; // no prompt 
     } 
    }); 
} 

aktualisieren

Da dies recht hoch auf Google viele Ansichten bekommen es sich lohnen würde, unter Hinweis darauf, dass diese Antwort nicht mehr funktioniert.

$(window).bind('beforeunload', function() { 

Beachten Sie, dass das Ereignis nicht mehr aktiviert ist. Die Verwendung der vorherigen onbeforeunload in späteren Versionen von jQuery führt zu nichts passiert.