2009-02-11 5 views
21

J'ai un contrôle de grille AJAX.Puis-je empêcher l'appel de window.onbeforeunload lors d'un appel AJAX?

Nous nous connectons à l'événement window.onbeforeunload pour vérifier s'ils contiennent des données non sauvegardées et, si c'est le cas, les affichent avec un message "Êtes-vous sûr de vouloir quitter ... vous avez des données non sauvegardées ...".

Tout cela est bon. Mais les appels AJAX déclenchent aussi window.onbeforeunload et donc si la grille contient des données non sauvegardées et que nous faisons un appel AJAX (comme pour supprimer une ligne dans une autre grille), l'utilisateur obtient le message "Etes-vous sûr de vouloir naviguer ... vous avez des données non sauvegardées ... "message qui n'est pas bon.

Est-il possible de supprimer l'événement onbeforeunload pour les appels AJAX? Ou est-il possible de détecter qu'un appel est un appel AJAX? Sinon, nous devrons faire du piratage!

Merci

Répondre

2
Ce

est vraiment bizarre, vous que votre appel Ajax ne se charge pas un nouveau lien?

Assurez-vous de lire cette spécification pertinente: onbeforeunload spec

Voir si l'appel Ajax déclenche peut-être l'une des actions énumérées dans le Pour appeler la table.

+0

Merci. Lisez la spécification et il fait référence à "document.write" sous "To invoke". Cela arrive certainement avec la bibliothèque de grilles que nous utilisons. – Paul

0

Si vous parlez des postbacks partiels ASP.NET AJAX, j'ai rencontré ce comportement aujourd'hui, en faisant exactement la même chose. (Si vous n'êtes pas, ignorer complètement mon post.)

Dans mon expérience, il semble à ce jour comme si votre postback partielle est déclenchée par une entrée , il ne se déclenche pas onbeforeunload lors d'un postback partiel , mais si la publication partielle est déclenchée par un lien , il le fera. Il semble que le navigateur suppose que vous naviguez loin si vous cliquez sur quoi que ce soit dans une balise d'ancrage (seulement testé dans IE et FireFox mais oui).

Que la page ait ou non un certain champ caché est déjà ce que j'utilisais pour déterminer le côté client lorsqu'il est approprié d'afficher l'avertissement de navigation, donc j'ai été en mesure de résoudre ce problème très simplement en ajoutant une vérification du la valeur du champ masqué à ma condition if d'onbeforeunload, et l'accrochage dans les gestionnaires BeginRequest et EndRequest de PageRequestManager pour définir la valeur. Cela désactive effectivement l'avertissement pendant les publications partielles. Vous pourriez ajouter une logique plus compliquée ici s'il y avait des choses plus spécifiques que vous vouliez vérifier.

Voici un exemple de code vraiment trop simplifié. (. Désolé si je Pared et censuré au point où il ne fonctionne pas, mais il devrait vous donner une idée)

window.onbeforeunload = checkNavigateAway; 

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest); 
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest); 

function onBeginRequest(sender, args) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0) { 
     navigateAwayFlag[0].value = "false"; 
    } 
} 

function onEndRequest(sender, args) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0) { 
     navigateAwayFlag[0].value = "true"; 
    } 
} 

function checkNavigateAway() { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true") 
    { 
     return "Warning Text"; 
    } 
} 

Modifier: Mauvaises nouvelles. Ce qui précède ne semble pas fonctionner dans IE6. Il semble que cela déclenche des événements dans un ordre différent de celui de Firefox, donc l'onbeforeunload se déclenche avant l'AJAX beginRequest ... Il faudra peut-être trouver un moyen de changer la valeur du drapeau via le lien hypertexte avant le déclenchement de onbeforeunload.

5

je fait quelque chose comme ceci:

intérieur balise body:

var allowConfirm = true; 

    window.onbeforeunload = confirmExit; 
    function confirmExit() 
    { 
    if(allowConfirm) 
     return "Are you sure you want to navigate away from this page?"; 
    else 
     allowConfirm = true; 
    } 

Quand je déconnexion, j'appelle ce script:

allowConfirm = false; return window.location.href;

+0

Cela a fonctionné pour moi. Mes liens Enregistrer et Annuler font des appels à un gestionnaire ashx et cela a forcé un déchargement, et je ne voulais pas que le popup apparaisse lors de la sauvegarde ou de l'annulation de la page. – Ray

30

Si vous voulez déclencher votre postback par un lien hypertexte, il existe une solution simple: Au lieu de

<a href="javascript:submitFunction();">Submit</a>

ou

<a href="javascript:;" onclick="submitFunction();">Submit</a>

il suffit d'utiliser ce code:

<a href="#" onclick="submitFunction();">Submit</a>

Il semble que IE déclenche l'événement onbeforeunload si le contenu de l'attribut href d'un lien hypertexte n'est pas la page en cours (ce que le caractère pointu indique).

+0

Cela a empêché l'événement onbeforeunload d'être déclenché. – dhinesh

+4

Si vous définissez le href "###" au lieu de "#", les navigateurs n'auront pas l'avantage de passer en haut de la page. –

+1

Ceci est une excellente solution, mais j'utilise asp: linkButtons dans un répéteur, donc je n'ai pas le choix de la façon de formater le href. Ils sont structurés comme suit ... des idées pour cette configuration? supprimer Merci – hardba11

0

Cela fonctionne réellement:

OnClientClick="eval(this.href);return false" 
2

Dans le cas de IE6 ou href vous pouvez brancher la fonction postback. -à-dire: si la fonction postback est WebForm_DoPostBackWithOptions et en utilisant Jquery, ajoutez ce code ci-dessous pour le code ci-dessus

var DoPostBackWithOptionsHook = null; 

$(document).ready(function(){ 
    DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions; 
    WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook; 
} 

function WebForm_DoPostBackWithOptionsHook(options) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
     if (navigateAwayFlag.length > 0) { 
      navigateAwayFlag[0].value = "false"; } 

    return DoPostBackWithOptionsHook(options) 
} 
0

Une solution à ce problème est d'appeler submitFunction() sur événement click tag hyperlien en utilisant jquery et retirez le href attribut du lien hypertexte.

0

ce n'est pas possible, il n'y a aucun moyen de savoir si le bouton d'actualisation du navigateur a été enfoncé.

0

N'utilisant pas AJAX, mais souhaitant toujours éviter de quitter la page avec des modifications non enregistrées. J'ai essayé la plupart des suggestions précédentes, y compris navigateAway. Aucun d'entre eux a travaillé avec IE 8. NavigateAway toujours retourné la longueur de 0.

J'ai trouvé un blog sur cette solution sur l'utilisation de la classe comme ID dans la balise, puis la définition de booléen sur cette base. J'ai essayé cela, mais cela ne fonctionne pas parce que .NET quand il sort le HTML enveloppait la balise d'entrée dans une balise span avec la classe déclarée dedans. Ma dernière solution était de mettre le mot Ignorer dans le nom d'identification de l'étiquette. En outre, pour empêcher que bebeforeunload soit appelé avant que le clic ne soit intercepté par le code qui définit le booléen, il faut utiliser, comme asp: Button ou asp: Input. Finalement, les forces d'asp (de VS IDE) font que le nom de départ soit le type de contrôle; ID = "Button_Save". L'utilisation de tags asp: empêche également d'appeler deux fois onsbeforeunload.

<script type="text/javascript" language="javascript"> 
var stuffchanged = false 
var ignorenavigate = false 

    $(document).ready(function() { 


    //Detect whether the event source has "nonavigate" class specified 
    $("a,input,img,checkbox,button").click(function() { 
     var str = $(this).attr("ID"); 
     ignorenavigate = str.search("Ignore") > 0; 
    }); 

}); 

window.onbeforeunload = confirmExit; 
function confirmExit() { 
    if (stuffchanged && !ignorenavigate) { 
     return "You have attempted to leave this page with unsaved changes. If you have made any changes to the fields without " + 
    "clicking the Save button, your changes will be lost. Are you sure you want to exit this page?"; 
    } 

} 

    function textchanged() { 
    stuffchanged = true; 
    } 

Questions connexes