10
votes

Puis-je détecter lorsqu'un utilisateur passe à une page à l'aide du bouton arrière?

EDIT STROND>: Ce que j'ai vraiment besoin de savoir, c'est s'il y a un événement JavaScript qui incendie de manière fiable lorsque l'utilisateur arrive à la page via le bouton arrière. J'ai essayé l'événement code> sur code> pour le corps code> élément code>, mais il ne tire pas sur Firefox ou Safari.


Je travaille avec un code ancien Essaie d'empêcher 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 un (en écoutant l'événement ONSUBMIT du formulaire). Ce code est appliqué à chaque formulaire de l'application, que la double soumission soit même un problème. P>

Le problème est que si l'utilisateur frappe le bouton arrière de Firefox ou de Safari, tous les boutons Soumettre sont toujours désactivés quand il arrive à la page. Sur Firefox, ils sont même désactivés après un rafraîchissement (seulement une rafraîchissement CTRL + F5 le fera)! P>

J'ai essayé d'écouter code> Corps code> S Onload Événement, mais FF et Safari ne tirent pas que lorsque vous arrivez à la page via le bouton arrière. (Fait intéressant, il est tiré sur un rafraîchissement souple sur FF, même si le bouton reste désactivé.) P>


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

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


4 commentaires

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


Dupliquer de Stackoverflow. com / questions / 54539 / ... et beaucoup, beaucoup d'autres. Recherchez Stackoverflow.com/search?q=back+button


Eh bien, je ne pense pas que ce soit exactement un duplicata. J'ai fait la recherche d'abord et j'ai vu la plupart de ces questions. La plupart d'entre eux sont sur la prévention de l'utilisation du bouton arrière. Je suppose que ma vraie question (que j'avais échoué clairement) est s'il ya un événement qui incendie de manière fiable lorsque l'utilisateur arrive sur ma page via le bouton arrière.


J'ai édité ma réponse. Après avoir été visité à nouveau une fois que vous avez mis un cookie. Ensuite, s'ils rafraîchissent le cookie existe toujours et il vous suffit de vous assurer que c'est dans la déclaration si. Essayez ça .... laissez-moi savoir comment ça fonctionne.


4 Réponses :


1
votes

Je ne pense pas que vous puissiez tester le bouton arrière spécifiquement, mais je pense que vous pouvez vérifier la position de l'historique du navigateur avec JavaScript.


2 commentaires

Vous pouvez comparer l'historique.current avec historique.Longueur, mais uniquement si votre script est fait confiance.


Il semble que les navigateurs modernes (2012) ne soutiennent pas l'historique.Current, alors j'ai ajouté une nouvelle réponse.



2
votes

N'est-ce pas le comportement que vous voulez, de sorte qu'ils ne soumettent pas à l'aide du bouton arrière?

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


1 commentaires

Dans certains cas, oui. Le problème est qu'il est appliqué unilatéralement à toutes les formes de notre application et, dans certains d'entre elles, il est logique que l'utilisateur redevienne et utilise un bouton de soumission différent pour accéder à une vue différente. (Je ne l'ai pas conçu, j'essaie seulement de travailler avec elle)



2
votes

Oui. Dans JavaScript, vous pouvez utiliser visity.Value xxx

vous l'appeleriez dans la balise de connexion FYI.


3 commentaires

Cela l'a fait de sorte qu'un rafraîchissement après avoir frappé le dos réactivait le bouton, mais le bouton était toujours désactivé après avoir frappé le dos. S'il n'y a pas une meilleure alternative, je pourrais peut-être utiliser cela comme solution de contournement.


Merci de continuer à regarder cela, mais le problème est que si je le mettit dans l'attribut de téléchargement de l'étiquette du corps, cela ne s'appelle pas immédiatement. L'utilisateur doit toujours rafraîchir manuellement pour cela à être initié. Ce que j'aimerais (et je ne suis pas sûr si cela est possible) est de trouver un événement que je peux écouter cela ira dès que l'utilisateur est affiché la page (après pression sur le bouton arrière)


Utilisez-vous Visual Studio? Dans quel environnement de programmation êtes-vous?



0
votes

La réponse de @tkotitan a probablement été correcte quand il l'a écrit. Sa réponse m'a conduit à ma solution. Ce n'est pas infaillible, mais cela 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 destinée à une page intermédiaire qui fonctionne maintenant comme intermédiaire dans les deux directions. P>

<?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';
}
?>


0 commentaires