Comment puis-je prévenir la fenêtre.onbeforeunload d'être déclenchée par javascript: href liens dans IE?
Je suis en train de construire un fail safe pour mon formulaire qui va avertir les utilisateurs que s'ils quittent la page de leur forme, les données seront perdues (similaire à ce que gmail n').
window.onbeforeunload = function () {
if (formIsDirty) {
return "You have unsaved data on this form. Don't leave!";
}
}
La fonction ci-dessus fonctionne très bien sous firefox, mais sous IE il est déclenché par tout href lien, même ceux qui sont des liens vers javascript et pas d'autres pages.
par exemple....
<a href='javascript:someFunction();'>click</a>
Je me demandais si il n'y a aucun moyen de contourner ce problème, car je ne veux pas que l'utilisateur en pensant qu'ils sont de quitter la page quand ils sont simplement en cliquant sur un bouton. Je n'ai pas l'option de réécriture de tous les différents liens comme ils sont construits dans et nombreux.
Des idées?
- Il suffit de ne pas utiliser ces liens. Utiliser Javascript discret à la place.
- Ce n'est pas une option. Nous sommes à l'aide d'un système très complexe qui a déjà des tas de trucs, construite dans. Je préfère ne pas réinventer la roue dans cette instance.
- Pouvez-vous changer les liens une fois la page chargée?
- "Ne quittez pas !" est dictatorial. Vous devriez mieux avertir "Si vous partez, les données non enregistrées seront perdues." Si l'utilisateur veut quitter permettra à l'utilisateur de quitter, peu importe ce que vous essayez. Le plus vous prenez abusif de tactiques, de plus les navigateurs et les utilisateurs de les ignorer.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez supprimer et ré-attribuer le onbeforeunload lorsque le curseur de ces liens:
Je viens de tomber sur un même problème et trouvé une solution très simple:
Cela permettra d'éliminer l'événement onbeforeunload juste avant l'événement click est déclenchée.
Déplacer n'importe quel script pour un
click
gestionnaire d'événement au lieu de cela, avec un repli de page pour les utilisateurs sans JavaScript:La discrète JS champions hors il y aura probablement s'opposer à l'utilisation de la
onclick
attribut, mais le fait est que ça fonctionne, c'est la façon la plus simple pour ajouter un gestionnaire d'événements et de la façon la plus simple de donner un exemple. Pour une meilleure séparation des préoccupations, vous pouvez à la place utiliser un DOM0onclick
propriété,addEventListener()
/attachEvent()
ou une bibliothèque.beforeunload
de l'événement aussi longtemps quesomeFunction()
ne jette pas une erreur: lereturn false
y veille.Si vous incluez un signet symbole dans le href de la balise, vous devriez être en mesure de toujours utiliser l'événement onclick d'inclure votre JavaScript.
J'ai couru un certain nombre de tests et cela semble pour exécuter JavaScript sans déclenchement de l'événement onbeforeunload. Je serais curieux de savoir si cela fonctionne pour d'autres ou si vous avez toujours le même problème après la mise en œuvre d'une des balises de cette manière.
(Comme certains des autres réponses, cela exige de changer la façon dont le JavaScript est lié. Si cela ne fonctionne pas pour vous, mépris.)
J'ai trouvé que dans IE 7 par IE 10, simplement à l'aide de jQuery .cliquez sur() avec
preventDefault
fonctionne sans montrer leonbeforeunload
message (IE 11 ne montre pas labeforeunload
un message de mon cas de test). C'est vrai que le href est '#' oujavascript:void(0)
. J'attends la conclusion tient siattachEvent
/addEventListener
est utilisé directement, mais je n'ai pas tester.Il y a une démo de l', ci-dessous,http://jsbin.com/tatufehe/1 . Les deux versions (en vert) avec
preventDefault
de travail (ne pas montrer labeforeunload
boîte de dialogue). L'un sanspreventDefault
ne le montrer (à titre de comparaison).Si l'utilisateur de la souris sur un lien et elles déclenchent actualiser la page avec le clavier ou activer un lien avec le clavier, l'invite de ne pas s'afficher. Le Dr Molle approche ne fonctionnera pas dans ce cas rares.