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.
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