Sur IE, je peux le faire avec jQuery (terriblement non standard, mais qui fonctionne)
if ($.browser.msie)
$(document).keydown(function(e) { if (e.keyCode == 8) window.event.keyCode = 0;});
Mais est-il possible de faire d'une manière qui fonctionne sur Firefox, ou d'une manière multi-navigateur pour un bonus?
Pour mémoire:
$(document).keydown(function(e) { if (e.keyCode == 8) e.stopPropagation(); });
ne fait rien.
$(document).keydown(function(e) { if (e.keyCode == 8) e.preventDefault(); });
résout le problème, mais rend la clé de retour arrière inutilisable sur la page, ce qui est encore pire que le comportement d'origine.
EDIT: La raison pour laquelle je fais cela est que je ne crée pas une simple page Web mais une grande application. C'est incroyablement ennuyeux de perdre 10 minutes de travail simplement parce que vous avez appuyé sur la touche de retour au mauvais endroit. Le rapport entre la prévention des erreurs et les utilisateurs ennuyeux devrait être bien supérieur à 1000/1 en empêchant la touche de retour arrière de revenir en arrière.
EDIT2: Je n'essaie pas d'empêcher la navigation dans l'historique, juste les accidents.
EDIT3: Commentaire @brentonstrines (déplacé ici car la question est si populaire): il s'agit d'un «correctif» à long terme, mais vous pouvez apporter votre soutien derrière le bogue Chromium pour changer ce comportement dans le webkit
la source
Réponses:
Ce code résout le problème, au moins dans IE et Firefox (je n'en ai testé aucun autre, mais je lui donne une chance raisonnable de fonctionner si le problème existe même dans d'autres navigateurs).
la source
d.type.toUpperCase() === 'PASSWORD'
également. Sinon, ça a l'air bienif( $(d).is( ":input" ) )...
d.isContentEditable
ici.Ce code fonctionne sur tous les navigateurs et avale la touche de retour arrière lorsqu'il n'est pas sur un élément de formulaire, ou si l'élément de formulaire est désactivé | en lecture seule. Il est également efficace, ce qui est important lorsqu'il s'exécute sur chaque clé tapée.
la source
if(!rx.test(e.target.tagName) || $(e.target).is(':checkbox') || $(e.target).is(':radio') || $(e.target).is(':submit') || e.target.disabled || e.target.readOnly )
contentEditable
..is(':checkbox,:radio,:submit')
Les autres réponses ici ont établi que cela ne peut pas être fait sans liste blanche dans laquelle le retour arrière est autorisé. Cette solution n'est pas idéale car la liste blanche n'est pas aussi simple que les simples zones de texte et les entrées de texte / mot de passe, mais elle se révèle à plusieurs reprises incomplète et doit être mise à jour.
Cependant, puisque le but de supprimer la fonctionnalité de retour arrière est simplement d'empêcher les utilisateurs de perdre accidentellement des données, la solution beforeunload est bonne car la fenêtre contextuelle modale est surprenante - les fenêtres contextuelles modales sont mauvaises lorsqu'elles sont déclenchées dans le cadre d'un flux de travail standard, parce que l'utilisateur s'habitue à les rejeter sans les lire, et ils sont ennuyeux. Dans ce cas, la popup modale n'apparaîtrait que comme une alternative à une action rare et surprenante, et est donc acceptable.
Le problème est qu'un modal onbeforeunload ne doit pas apparaître chaque fois que l'utilisateur s'éloigne de la page (comme en cliquant sur un lien ou en soumettant un formulaire), et nous ne voulons pas commencer à mettre sur liste blanche ou sur liste noire des conditions onbeforeunload spécifiques.
La combinaison idéale de compromis pour une solution généralisée est la suivante: gardez une trace si le retour arrière est pressé, et ne faites apparaître le modal onbeforeunload que si c'est le cas. En d'autres termes:
Cela a été testé pour fonctionner dans IE7 +, FireFox, Chrome, Safari et Opera. Déposez simplement cette fonction dans votre global.js et appelez-la depuis n'importe quelle page où vous ne voulez pas que les utilisateurs perdent accidentellement leurs données.
Notez qu'un modal onbeforeunload ne peut être déclenché qu'une seule fois, donc si l'utilisateur appuie à nouveau sur le retour arrière, le modal ne se déclenchera plus.
Notez que cela ne se déclenchera pas lors d'événements de hachage, mais dans ce contexte, vous pouvez utiliser d'autres techniques pour empêcher les utilisateurs de perdre accidentellement leurs données.
la source
Une solution plus élégante / concise:
la source
Modification de la réponse d'erikkallen pour répondre à différents types d'entrée
J'ai trouvé qu'un utilisateur entreprenant pouvait appuyer sur la touche de retour arrière sur une case à cocher ou un bouton radio dans une vaine tentative pour la désactiver et à la place, il reculerait et perdrait toutes ses données.
Ce changement devrait résoudre ce problème.
Nouvelle modification pour traiter les divs modifiables du contenu
Exemple
Pour tester créer 2 fichiers.
starthere.htm - ouvrez-le d'abord pour avoir un endroit où revenir
test.htm - Cela permet de revenir en arrière lorsque vous appuyez sur la touche de retour arrière alors que la case à cocher ou la soumission a le focus (obtenue par tabulation). Remplacez par mon code pour corriger.
la source
Sur la base des commentaires, il semble que vous souhaitiez empêcher les gens de perdre des informations dans les formulaires, s'ils appuient sur la touche de retour arrière pour supprimer mais que le champ n'est pas ciblé.
Dans ce cas, vous souhaitez consulter le gestionnaire d' événements onunload . Stack Overflow l'utilise - si vous essayez de quitter une page lorsque vous avez commencé à écrire une réponse, un avertissement s'affiche.
la source
Arrêtez de naviguer ce code fonctionne!
Mais pour ne pas restreindre les champs de texte mais d'autres
Pour l'empêcher pour un champ spécifique, utilisez simplement
Se référant à celui-ci ci-dessous!
Empêcher BACKSPACE de revenir en arrière avec jQuery (comme la page d'accueil de Google)
la source
La plupart des réponses sont en jquery. Vous pouvez le faire parfaitement en Javascript pur, simple et sans bibliothèque requise. Cet article était un bon point de départ pour moi, mais comme keyIdentifier est obsolète, je voulais que ce code soit plus sécurisé, j'ai donc ajouté || e.keyCode == 8 à l'instruction if. De plus, le code ne fonctionnait pas bien sur Firefox, j'ai donc ajouté return false; et maintenant ça marche parfaitement bien. C'est ici:
Ce code fonctionne très bien car,
la source
Combiner les solutions proposées par "thetoolman" && "Biff MaGriff"
le code suivant semble fonctionner correctement dans IE 8 / Mozilla / Chrome
la source
Je ne sais pas pourquoi personne ne vient de répondre à cela - cela semble être une question technique parfaitement raisonnable pour demander si c'est possible.
Non, je ne pense pas qu'il existe un moyen multi-navigateur pour désactiver le bouton de retour arrière. Je sais que ce n'est pas activé par défaut dans FF ces jours-ci.
la source
J'ai eu du mal à trouver une réponse non JQUERY. Merci à Stas de m'avoir mis sur la piste.
Chrome: si vous n'avez pas besoin de la prise en charge de plusieurs navigateurs, vous pouvez simplement utiliser une liste noire, plutôt qu'une liste blanche. Cette version JS pure fonctionne dans Chrome, mais pas dans IE. Pas sûr de FF.
Dans Chrome (version 36, mi-2014), les pressions de touches qui ne se trouvent pas sur une entrée ou un élément modifiable semblent être ciblées
<BODY>
. Cela permet d'utiliser une liste noire, que je préfère à la liste blanche. IE utilise la cible du dernier clic - il peut donc s'agir d'un div ou de toute autre chose. Cela rend cela inutile dans IE.Cross Browser: Pour le javascript pur, j'ai trouvé que la réponse de Stas était la meilleure. L'ajout d'une vérification de condition supplémentaire pour contenteditable l'a fait fonctionner pour moi *:
* Notez que les IE [edit: et Spartan / TechPreview] ont une "fonctionnalité" qui rend les éléments liés aux tables non modifiables . Si vous cliquez sur l'un de ceux-ci et PUIS appuyez sur retour arrière, il reviendra en arrière. Si vous n'avez pas de modifiables
<td>
, ce n'est pas un problème.la source
Cette solution est similaire à d'autres qui ont été publiées, mais elle utilise une simple liste blanche la rendant facilement personnalisable pour autoriser le retour arrière dans les éléments spécifiés simplement en définissant le sélecteur dans la fonction .is ().
Je l'utilise sous cette forme pour empêcher le retour arrière sur les pages de revenir en arrière:
la source
Pour élaborer un peu sur l' excellente réponse de @ erikkallen , voici une fonction qui permet tous les types d'entrée basés sur le clavier, y compris ceux introduits en HTML5 :
la source
JavaScript - manière jQuery:
Javascript - la manière native, qui fonctionne pour moi:
la source
J'ai eu quelques problèmes avec la solution acceptée et le plugin Select2.js; Je n'ai pas pu supprimer les caractères dans la zone modifiable car l'action de suppression était empêchée. C'était ma solution:
Select2 crée un Span avec un attribut "contentEditable" qui est défini sur true pour la zone de liste modifiable modifiable qu'il contient. J'ai ajouté du code pour prendre en compte les étendues tagName et les différents attributs. Cela a résolu tous mes problèmes.
Edit: Si vous n'utilisez pas le plugin Select2 combobox pour jquery, alors cette solution peut ne pas être nécessaire par vous, et la solution acceptée pourrait être meilleure.
la source
la source
Ce code résout le problème dans tous les navigateurs:
la source
DIV
ouTD
.Moyen le plus simple d'empêcher la navigation en appuyant sur la touche de retour arrière
la source
En utilisant Dojo toolkit 1.7, cela fonctionne dans IE 8:
la source
Avez-vous essayé la solution très simple consistant simplement à ajouter l'attribut suivant à votre champ de texte en lecture seule:
onkeydown = "return false;"
Cela empêchera le navigateur de revenir dans l'historique lorsque la touche Retour arrière est enfoncée dans un champ de texte en lecture seule. Peut-être que je manque votre véritable intention, mais il semble que ce serait la solution la plus simple à votre problème.
la source
Une solution beaucoup plus soignée -
Alternativement, vous ne pouvez vérifier que si
la source
Version javascript pur, qui fonctionne dans tous les navigateurs:
Bien sûr, vous pouvez utiliser "INPUT, TEXTAREA" et utiliser "if (! Regex.test (elements))" alors. Le premier a bien fonctionné pour moi.
la source
Performance?
J'étais inquiet pour les performances et j'ai fait un violon: http://jsfiddle.net/felvhage/k2rT6/9/embedded/result/
J'ai analysé les méthodes les plus prometteuses que j'ai trouvées dans ce fil. Il s'avère qu'ils étaient tous très rapides et ne posent probablement pas de problème de "lenteur" lors de la frappe. La méthode la plus lente que j'ai examinée était d'environ 125 ms pour 10 000 appels dans IE8. Soit 0,0125 ms par course.
J'ai trouvé que les méthodes publiées par Codenepal et Robin Maben étaient les plus rapides ~ 0,001 ms (IE8) mais méfiez-vous des différentes sémantiques.
C'est peut-être un soulagement pour quelqu'un qui introduit ce type de fonctionnalité à son code.
la source
Réponse erikkallen modifiée:
la source
Cette solution a très bien fonctionné lors des tests.
J'ai ajouté du code pour gérer certains champs de saisie non balisés avec entrée et pour les intégrer dans une application Oracle PL / SQL qui génère un formulaire d'entrée pour mon travail.
Mes deux centimes":
la source
J'ai créé un projet NPM avec une version propre de l'actuel accepté (d'erikkallen)
https://github.com/slorber/backspace-disabler
Il utilise essentiellement les mêmes principes mais:
la source
Voici ma réécriture de la réponse la plus votée. J'ai essayé de vérifier element.value! == indéfini (car certains éléments comme peuvent ne pas avoir d'attribut html mais peuvent avoir une propriété de valeur javascript quelque part sur la chaîne du prototype), mais cela ne fonctionnait pas très bien et avait beaucoup de cas marginaux. Il ne semble pas y avoir de bon moyen de pérenniser cela, donc une liste blanche semble la meilleure option.
Cela enregistre l'élément à la fin de la phase de bulle d'événement, donc si vous souhaitez gérer le retour arrière d'une manière personnalisée, vous pouvez le faire dans d'autres gestionnaires.
Cela vérifie également l'instance de HTMLTextAreElement car on pourrait théoriquement avoir un composant Web qui en hérite.
Cela ne vérifie pas contentEditable (à combiner avec d'autres réponses).
https://jsfiddle.net/af2cfjc5/15/
la source
Sitepoint: désactiver le retour pour Javascript
event.stopPropagation()
etevent.preventDefault()
ne rien faire dans IE. J'ai dû envoyer le retourevent.keyCode == 11
(je viens de choisir quelque chose) au lieu de simplement dire"if not = 8, run the event"
pour le faire fonctionner.event.returnValue = false
fonctionne également.la source
Une autre méthode utilisant jquery
la source
J'utilise cela dans mon code depuis un certain temps maintenant. J'écris des tests en ligne pour les étudiants et suis tombé sur le problème lorsque les étudiants appuyaient sur le retour arrière pendant leur test et cela les ramènerait à l'écran de connexion. Frustrant! Cela fonctionne sur FF à coup sûr.
la source