2009-07-15 5 views
9

Modifier: Ce que je dois vraiment savoir, c'est s'il y a un événement javascript qui se déclenchera de manière fiable lorsque l'utilisateur arrive à la page via le bouton de retour. J'ai essayé l'événement onload pour l'élément body, mais il ne se déclenche pas sur Firefox ou Safari.Puis-je détecter lorsqu'un utilisateur accède à une page à l'aide du bouton Précédent?


Je travaille avec un vieux code qui tente d'éviter la double soumission des données de formulaire en désactivant tous les boutons de soumission de formulaire dès que l'utilisateur clique sur l'un (en écoutant l'événement onSubmit du formulaire). Ce code est appliqué à tous les formulaires de l'application, que la double-soumission soit ou non un problème.

Le problème est que si l'utilisateur appuie sur le bouton de retour dans Firefox ou Safari, tous les boutons de soumission sont toujours désactivés lorsqu'il accède à la page. Sur Firefox, ils sont même désactivés après un rafraîchissement (seul un rafraîchissement Ctrl + F5 le fera)!

J'ai essayé d'écouter body l'événement onLoad, mais FF et Safari ne se déclenchent pas lorsque vous arrivez à la page via le bouton de retour. (Fait intéressant, il est tiré sur un rafraîchissement doux sur FF, même si le bouton reste désactivé.)


Voici un document HTML très simple qui montrera ce que je veux dire:

<html><body> 
<form name="theForm" id="theForm" action="test2.html" 
     onSubmit="document.theForm.theButton.disabled = true;"> 
    <input id="theButton" type="submit" name="theButton" value="Click me!" /> 
</form> 
</body></html> 

Note: J'ai testé sur WinXP avec IE8, FF3.5, Safari 4, Opera 9 et Chrome 2.0. Seuls Safari et FF désactivent le bouton lorsque vous revenez pour les atteindre.

+0

avez-vous essayé ma réponse? – Eric

+0

oui, j'ai ajouté un commentaire ci-dessous (désolé, je faisais cela au travail et il était temps de rentrer à la maison) – Kip

+0

Dupliquer de http://stackoverflow.com/questions/54539/prevent-use-of-the-back- button-in-ie et beaucoup, beaucoup d'autres. Rechercher http://stackoverflow.com/search?q=back+button –

Répondre

1

Je ne pense pas que vous pouvez tester le bouton de retour en particulier, mais je crois que vous pouvez vérifier la position de l'historique du navigateur avec Javascript.

+0

Vous pouvez comparer history.current avec history.length, mais seulement si votre script est fiable. – Kev

+0

Il semble que les navigateurs modernes (2012) ne supportent pas history.current, j'ai donc ajouté une nouvelle réponse. – TecBrat

2

N'est-ce pas le comportement que vous voulez, de sorte qu'ils ne sont pas soumis en double en utilisant le bouton de retour?

Quoi qu'il en soit, vous pouvez définir un cookie sur la page suivante, et le détecter lors du chargement sur la page avec le formulaire.

+0

dans certains cas, oui. le problème est qu'il est appliqué unilatéralement à tous les formulaires de notre application, et dans certains d'entre eux, il est logique que l'utilisateur revienne en arrière et utilise un autre bouton de soumission pour accéder à une vue différente. (Je ne l'ai pas conçu, j'essaye seulement de travailler avec) – Kip

2

Oui. En javascript, vous pouvez utiliser visited.value

function checkrefresh() 
var visited = getCookie("visited"); 
{ 
     if((form.visited.value == '' || form.visited.value == null) && (visited != '1')) 
     { 
      document.form.visited.value = "1"; 
        document.cookie = "visited=1"; 
        //here you set it to something so that next time they go to the page it will no longer be nothing and you can 'disable the button' see below. 

     } 
     else 
     { 
      document.form.submitbutton.disabled=true; 
     } 
    } 

function getCookie(name) 
{ 
var re = new RegExp(name + "=([^;]+)"); 
var value = re.exec(document.cookie); 
return (value != null) ? unescape(value[1]) : null; 
} 

vous appelez cela dans l'étiquette onload FYI.

+0

Cela fonctionne vraiment pour moi! – Eric

+0

cela a fait en sorte qu'une actualisation après avoir appuyé sur réactiverait le bouton, mais le bouton était toujours désactivé après avoir appuyé sur. S'il n'y a pas une meilleure alternative, je devrais utiliser cela comme une solution de contournement. – Kip

+0

oui. L'actualisation redéfinit la valeur de la visite à 0. – Eric

0

La réponse par @tkotitan était probablement correcte quand il l'a écrit. Sa réponse m'a conduit à ma solution. Ce n'est pas infaillible, mais il pourrait être «assez bon» pour aider dans certaines situations.

J'ai amélioré mon script et l'ai remplacé par ce qui suit. Cette version est pour une page intermédiaire qui fonctionne maintenant comme intermédiaire dans les deux directions.

<?php 
if($_SERVER['QUERY_STRING']=='') 
{ 
    echo '<a href="go_back_test.php?page=1">Go forward</a>'; 
} 
elseif($_GET['page']!=2) 
{ 
    echo 'You cannot stay here.'; 
    echo ' 
    <script type="text/javascript"> 
    function test() 
    { 
     if (document.getElementById("detectback").value=="goneback") 
     { 
      document.getElementById("detectback").value=history.length; 
     } 
     if (document.getElementById("detectback").value==history.length) 
     { 
      document.getElementById("detectback").value="goneforward"; 
      window.location = "go_back_test.php?page=2" 
     } 
     else 
     { 
      document.getElementById("detectback").value="goneback"; 
      window.history.back(); 
     } 
    } 
    function updateform() 
    { 
     if(document.getElementById("detectback").value=="") 
     { 
      document.getElementById("detectback").value=history.length; 
     } 
    } 
    </script> 
    <img src="spacer.gif" onload="updateform(); test();"><br> 
    <form> 
     <input id="detectback" type="text" value="" style="display: none;"> 
    </form> 
    '; 
} 
else 
{ 
    echo 'Welcome to page 2'; 
} 
?> 
Questions connexes