Je fais une application de quiz en ligne en php. Je souhaite empêcher l'utilisateur de revenir à un examen. J'ai essayé le script suivant mais il arrête ma minuterie. Que devrais-je faire?
J'ai inclus le code source. Le minuteur est stocké dans cdtimer.js
<script type="text/javascript">
window.history.forward();
function noBack()
{
window.history.forward();
}
</script>
<body onLoad="noBack();" onpageshow="if (event.persisted) noBack();" onUnload="">
J'ai le minuteur d'examen qui prend une durée pour l'examen à partir d'une valeur mysql . Le minuteur démarre en conséquence, mais il s'arrête lorsque je mets le code pour désactiver le bouton de retour. Quel est mon problème?
javascript
browser
Sawant Akshay
la source
la source
Réponses:
Il existe de nombreuses raisons pour lesquelles la désactivation du bouton de retour ne fonctionnera pas vraiment. Votre meilleur pari est d'avertir l'utilisateur:
Cette page répertorie un certain nombre de façons dont vous pouvez essayer de désactiver le bouton de retour, mais aucune n'est garantie:
http://www.irt.org/script/311.htm
la source
C'est généralement une mauvaise idée de remplacer le comportement par défaut du navigateur Web. Le script côté client ne dispose pas des privilèges suffisants pour effectuer cette opération pour des raisons de sécurité.
Il y a aussi peu de questions similaires posées,
Comment puis-je empêcher la touche de retour arrière de revenir en arrière?
Comment empêcher l'action de retour de l'historique par défaut du navigateur pour le bouton de retour arrière avec JavaScript?
Vous ne pouvez pas réellement désactiver le bouton de retour du navigateur. Cependant, vous pouvez faire de la magie en utilisant votre logique pour empêcher l'utilisateur de revenir en arrière, ce qui créera une impression comme si elle était désactivée. Voici comment consulter l'extrait de code suivant.
Ceci est en JavaScript pur, donc cela fonctionnerait dans la plupart des navigateurs. Cela désactiverait également la touche de retour arrière, mais la clé fonctionnera normalement dans les
input
champs ettextarea
.Configuration recommandée:
Placez cet extrait de code dans un script distinct et incluez-le sur une page où vous souhaitez ce comportement. Dans la configuration actuelle, il exécutera l'
onload
événement du DOM qui est le point d'entrée idéal pour ce code.DEMO fonctionnant!
Testé et vérifié dans les navigateurs suivants,
la source
location.hash
départ, ce qui m'a obligé à le faire comme ça. Il pourrait y avoir plus d'amélioration à cela, mais 50 ms une seule fois ne m'a pas coûté beaucoup, alors je m'en tiens là.Je suis tombé sur cela, ayant besoin d'une solution qui fonctionnait correctement et "bien" sur une variété de navigateurs, y compris Mobile Safari (iOS9 au moment de la publication). Aucune des solutions n'était tout à fait correcte. Je propose ce qui suit (testé sur IE11, FireFox, Chrome et Safari):
Notez ce qui suit:
history.forward()
(mon ancienne solution) ne fonctionne pas sur Mobile Safari --- il semble ne rien faire (c'est-à-dire que l'utilisateur peut toujours revenir en arrière).history.pushState()
fonctionne sur tous.history.pushState()
est une URL . Solutions qui transmettent une chaîne comme'no-back-button'
ou'pagename'
semblent fonctionner correctement, jusqu'à ce que vous essayiez ensuite une actualisation / rechargement sur la page, à quel point une erreur «Page non trouvée» est générée lorsque le navigateur essaie de localiser une page avec cette comme URL. (Le navigateur est également susceptible d'inclure cette chaîne dans la barre d'adresse lorsqu'il est sur la page, ce qui est moche.)location.href
Doit être utilisé pour l'URL.history.pushState()
est un titre . En regardant autour du Web, la plupart des endroits disent qu'il n'est "pas utilisé", et toutes les solutions ici passentnull
pour cela. Cependant, dans Mobile Safari au moins, cela place l'URL de la page dans le menu déroulant de l'historique auquel l'utilisateur peut accéder. Mais lorsqu'il ajoute normalement une entrée pour une page visitée, il met son titre , ce qui est préférable. Donc, passerdocument.title
pour cela entraîne le même comportement.la source
la source
window.history.back()
fonction. Nous voulons empêcher les utilisateurs de cliquer sur le bouton de retour du navigateur, mais dans certains cas, nous fournissons notre propre bouton de retour sur la page. Y a-t-il un moyen de le faire fonctionner?Ce code désactivera le bouton de retour pour les navigateurs modernes qui prennent en charge l'API HTML5 History. Dans des circonstances normales, le fait d'appuyer sur le bouton retour permet de revenir d'une étape à la page précédente. Si vous utilisez history.pushState (), vous commencez à ajouter des sous-étapes supplémentaires à la page actuelle. La façon dont cela fonctionne est, si vous deviez utiliser history.pushState () trois fois, puis commencez à appuyer sur le bouton de retour, les trois premières fois, il reviendrait dans ces sous-étapes, puis la quatrième fois, il reviendrait à la page précédente.
Si vous combinez ce comportement avec un écouteur d'événement sur l'
popstate
événement, vous pouvez essentiellement configurer une boucle infinie de sous-états. Donc, vous chargez la page, appuyez sur un sous-état, puis appuyez sur le bouton de retour, qui fait apparaître un sous-état et en pousse également un autre, donc si vous appuyez à nouveau sur le bouton de retour, il ne manquera jamais de sous-états pour appuyer . Si vous pensez qu'il est nécessaire de désactiver le bouton de retour, cela vous y mènera.la source
no-back-button
... (Le navigateur est également susceptible de s'afficherno-back-button
dans l'adresse bar aussi, qui semble moche.) Pour être juste, ce n'est pas la seule solution ici qui en souffre. Le 3ème argument dehistory.pushState()
est une url , et doit être l'url de votre page actuelle: utilisez à lalocation.href
place.Pour l'événement de retour de restriction du navigateur
la source
la source
C'est ainsi que j'ai pu l'accomplir. Étrangement, changer l'emplacement de la fenêtre n'a pas fonctionné correctement dans Chrome et Safari. Il arrive que l'emplacement.hash ne crée pas d'entrée dans l'historique pour Chrome et Safari. Vous devrez donc utiliser le pushstate. Cela fonctionne pour moi dans tous les navigateurs.
la source
$(document).ready(function () { .... });
la source
event.persisted
?Cet article sur jordanhollinger.com est la meilleure option que je ressens. Similaire à la réponse de Razor mais un peu plus claire. Code ci-dessous; crédits complets à Jordan Hollinger:
Page avant:
Page de JavaScript sans retour:
la source
Ce javascript ne permet à aucun utilisateur de revenir en arrière (fonctionne dans Chrome, FF, IE, Edge)
la source
Essayez-le facilement:
la source
Ce code a été testé avec les derniers navigateurs Chrome et Firefox.
la source
Fonction très simple et propre pour casser la flèche arrière sans interférer avec la page par la suite.
Avantages:
onbeforeunload
setInterval
pour ne pas casser les navigateurs lents et fonctionne toujours.unbeforeunload
ce qui interrompt l'utilisateur avec le dialogue modal.Remarque: certaines des autres solutions utilisent
onbeforeunload
. Veuillez ne pas utiliseronbeforeunload
à cette fin, qui ouvre une boîte de dialogue chaque fois que les utilisateurs essaient de fermer la fenêtre, appuyez sur la flèche arrière, etc.onbeforeunload
habituellement que dans des circonstances rares appropriés, comme quand ils ont effectivement apporté des modifications à l' écran et havre de paix » t les a sauvés, pas dans ce but.Comment ça fonctionne
C'est tout. Plus de déconner, pas de surveillance des événements en arrière-plan, rien d'autre.
Utilisez-le en une seconde
Pour déployer, ajoutez simplement ceci n'importe où sur votre page ou dans votre JS:
la source
Cela semble avoir fonctionné pour nous en désactivant le bouton de retour sur le navigateur, ainsi que le bouton de retour arrière vous ramenant.
la source
la source
Vous ne pouvez et ne devez tout simplement pas faire cela. Cependant, mais cela pourrait être utile
Fonctionne dans mon chrome et Firefox
la source
Essayez ceci pour empêcher le bouton de retour arrière dans IE qui agit par défaut comme "Retour":
la source
Je pense que la solution parfaite est en fait assez simple, que j'utilise depuis de nombreuses années maintenant.
Il s'agit essentiellement d'attribuer l'événement "onbeforeunload" de la fenêtre avec les événements "mouseenter" / "mouseleave" du document en cours de sorte que l'alerte ne se déclenche que lorsque les clics sont en dehors de la portée du document (qui pourrait alors être le bouton précédent ou suivant du navigateur)
la source
Dans un navigateur moderne, cela semble fonctionner:
la source
Aucune des réponses les plus votées n'a fonctionné pour moi dans Chrome 79 . Il semble que Chrome ait changé son comportement par rapport au bouton Retour après la version 75, voir ici:
https://support.google.com/chrome/thread/8721521?hl=en
Cependant, dans ce fil de discussion Google, la réponse fournie par Azrulmukmin Azmi à la toute fin a fonctionné. C'est sa solution.
Je ne comprends pas tout à fait ce qu'il a écrit, mais apparemment, un supplément
history.back() / history.forward()
est maintenant nécessaire pour bloquer Back dans Chrome 75+.la source
Je crée une page HTML (index.html). Je crée également un (mécanisme.js) dans un dossier / répertoire (script). Ensuite, je place tout mon contenu à l'intérieur de (index.html) en utilisant les balises form, table, span et div selon les besoins. Maintenant, voici le truc qui fera en sorte que le dos / l'avant ne fasse rien!
Tout d'abord, le fait que vous n'ayez qu'une seule page! Deuxièmement, l'utilisation de JavaScript avec des balises span / div pour masquer et afficher le contenu sur la même page en cas de besoin via des liens réguliers!
À l'intérieur de 'index.html':
À l'intérieur de 'mécanisme.js':
Cela semble poilu, mais notez les noms et les appels de fonction, le code HTML intégré et les appels d'identifiant de balise span. C'était pour montrer comment vous pouvez injecter différents HTML dans la même balise span sur la même page! Comment l'arrière / l'avant peut-il affecter cette conception? Ce n'est pas possible, car vous cachez des objets et en remplacez d'autres sur la même page!
Comment cacher et afficher? Voici: À l'intérieur des fonctions dans 'mécanisme.js' si nécessaire, utilisez:
À l'intérieur des fonctions d'appel 'index.html' via des liens:
et
J'espère que je ne vous ai pas donné mal à la tête. Désolé si je l'ai fait :-)
la source
Dans mon cas, c'était une commande. J'ai donc désactivé le bouton. Lorsque l'utilisateur a cliqué en arrière, le bouton était toujours désactivé. Lorsqu'ils ont cliqué une fois de plus en arrière, puis ont cliqué sur un bouton de page pour avancer. Je savais que leur commande avait été soumise et je suis passée à une autre page.
Dans le cas où la page serait réellement actualisée, ce qui rendrait le bouton (théoriquement) disponible; J'ai alors pu réagir lors du chargement de la page que la commande est déjà soumise et rediriger ensuite aussi.
la source
la source
javascript:
vous avez écrit définit une étiquette JavaScript nommée "javascript". Je doute fort que vous ayez voulu cela; Je soupçonne que vous mélangezhref=javascript:...
avec des<script>
blocs JavaScript . 2.language="JavaScript"
cessé d'être un<script>
attribut valide en HTML5. 3. Les 2 points ci-dessus n'ont pas beaucoup d'importance; ce qui compte, c'est quehistory.forward(1)
cela ne fonctionne pas dans Mobile Safari (du moins). Utilisezhistory.pushState()
plutôt l' une des réponses.Vous pouvez simplement mettre un petit script puis vérifier. Cela ne vous permettra pas de visiter la page précédente. Cela se fait en javascript.
La fonction window.onunload se déclenche lorsque vous essayez de visiter la page précédente ou précédente via le navigateur.
J'espère que cela t'aides.
la source
J'ai eu ce problème avec React.JS. (composant de classe)
Et résoudre facilement
J'ai utilisé
HashRouter
dereact-router-dom
.la source
Il suffit de définir
location.hash="Something"
, en appuyant sur le bouton de retour, le hachage sera supprimé de l'url mais la page ne reviendra pas.Cette méthode est bonne pour éviter tout retour accidentel, mais pour des raisons de sécurité, vous devez concevoir votre backend pour éviter de répondre à nouveaula source
la source