2009-08-21 9 views
70

J'ai cherché sur le Web à propos de cette question mais je n'ai rien trouvé:Comment fonctionne le bouton Précédent dans un navigateur Web?

Quelle est la logique du bouton de retour? Que se passe-t-il lorsque nous appuyons sur le bouton de retour d'un navigateur Web?

J'aimerais vraiment en savoir plus à ce sujet.

Merci.

+12

Est-il renvoyer la demande ou charge-t-elle la page du cache local? Les cookies créés dans la première réponse sont-ils envoyés lorsque vous répondez? etc. – Jimmy

Répondre

85

Votre navigateur conserve une pile (ou une liste, si vous voulez) des pages Web que vous avez visités dans cette fenêtre. Supposons que votre page d'accueil soit google.com et que vous visitiez quelques autres sites: youtube.com, yahoo.com et cnn.com. Lors de sa visite la dernière, la liste ressemble à ceci:

google.com -> youtube.com -> yahoo.com -> cnn.com 
              ^
              | 
             current page 

Lorsque vous appuyez sur le bouton Retour, le navigateur vous ramène à la page précédente dans la liste, comme ceci:

google.com -> youtube.com -> yahoo.com -> cnn.com 
           ^
           | 
          current page 

A À ce stade, vous pouvez appuyer à nouveau sur Retour pour vous rendre sur youtube.com, ou vous pouvez appuyer sur Transférer pour vous rediriger vers cnn.com. Disons que vous appuyez sur une deuxième fois:

google.com -> youtube.com -> yahoo.com -> cnn.com 
       ^
        | 
       current page 

Si vous allez maintenant, par exemple, abc.com, la liste change pour ressembler à ceci:

google.com -> youtube.com -> abc.com 
          ^
           | 
          current page 

Notez que les deux yahoo.com et cnn.com sont partis de la liste. C'est parce que vous avez pris une nouvelle route. Le navigateur conserve uniquement une liste des pages que vous avez visitées pour vous rendre là où vous vous trouvez, et non pas un historique de toutes les pages que vous avez visitées. Le navigateur ne sait rien sur la structure du site que vous visitez, ce qui peut conduire à un comportement surprenant.

Vous êtes sur un site de shopping (ne.com, comme un exemple court) qui a des catégories et sous-catégories de produits à parcourir. Le concepteur du site a soigneusement fourni breadcrumbs près du haut de la fenêtre pour vous permettre de naviguer dans les catégories. Vous démarrez sur la première page du site, cliquez sur Matériel, puis sur Mémoire. La liste ressemble maintenant à ceci:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem 
             ^
              | 
             current page 

Vous voulez revenir à la catégorie de matériel, de sorte que vous utilisez les miettes de pain pour aller jusqu'à la catégorie parente au lieu d'utiliser le bouton Précédent. Maintenant, la liste du navigateur ressemble à ceci:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw 
                 ^
                  | 
                current page 

Selon la structure du site, vous êtes allé vers l'arrière (un niveau), mais le navigateur est allé en avant parce que vous avez cliqué sur un lien. Chaque fois que vous cliquez sur un lien ou tapez une URL dans la barre d'adresse, vous avancez dans la mesure où le navigateur est concerné, que ce lien vous amène ou non à une page que vous avez déjà visité.

Enfin, vous voulez revenir à la page principale du site (ne.com). Vous pouvez utiliser la chapelure, mais cette fois vous cliquez sur le bouton Retour - il semble évident que cela devrait vous prendre un niveau, n'est-ce pas? Mais où cela vous mène-t-il?

Il est d'abord déroutant pour de nombreux utilisateurs (moi-même inclus, quand je fais exactement cela) qu'il vous prend «bas» un niveau, retour à la catégorie mémoire. En regardant la liste des pages, il est facile de voir pourquoi:

google.com -> ne.com -> ne.com/hw -> ne.com/hw/mem -> ne.com/hw 
              ^
              | 
             current page 

Pour revenir à la page principale en utilisant uniquement le bouton Précédent nécessiterait deux autres presses, vous emmène « retour » à la catégorie du matériel et enfin la page principale. Cela nous semble tellement évident pour les programmeurs, mais cela surprend toujours les utilisateurs réguliers parce qu'ils ne réalisent pas que le navigateur ne sait rien de la structure hiérarchique du site sur lequel ils se trouvent. Serait-ce génial si les navigateurs laissaient les concepteurs de sites programmer le bouton Précédent pour faire ce qui est évident (vous prendre un niveau) plutôt que ce qu'il fait maintenant? Editer: Un commentateur a demandé si le navigateur recharge la page ou l'affiche simplement dans son cache local.

La réponse est que cela dépend. Les concepteurs de sites peuvent spécifier si le navigateur doit mettre en cache la page ou non. Pour les pages non mises en cache, le navigateur recharge la page à partir du serveur lorsque vous appuyez sur Retour, comme si c'était la première fois que vous le visitiez. Pour les pages mises en cache, le navigateur l'affiche hors du cache, ce qui est beaucoup plus rapide.

+4

Lorsque le navigateur recherche dans le cache, vérifie-t-il la date d'expiration dans l'en-tête de la réponse du serveur? Je suppose que si la page a expiré, le navigateur va renvoyer la même requête, non? Est-ce que get et post sont traités de la même manière en ce qui concerne le bouton de retour? Merci pour votre excellente réponse. –

+4

Première question: oui, c'est correct. Si la page a expiré, le navigateur doit re-demander la page en utilisant la même URL et les données POST. Mais pour les opérations POST, la plupart des navigateurs demandent à l'utilisateur s'il souhaite le renvoyer. Je suppose que le fait de renvoyer les données POST pourrait entraîner des doublons, des doublons, etc. Il appartient au concepteur du site d'empêcher que cela se produise. –

+0

Oui, mais dans le cas d'un POST, je pense que le navigateur ne demandera que dans le cas de POST qui a expiré. Ai-je raison? Parce que quand je faisais du développement avec ASP.net, le bouton de retour revenait sur le serveur sans demander. –

2

L'idée de base est de revenir à la dernière page ou division de site logique.

En regardant Gmail, vous verrez si vous faites une recherche et cliquez sur un message, puis appuyez sur le bouton de retour, vous reviendrez à la recherche que vous avez faite.

Lorsque vous cliquez dessus dans la plupart des navigateurs, il renvoie la dernière requête http ou charge un cache si le navigateur met en cache des sites.

+0

Quand le navigateur utilise-t-il le cache et quand renvoie-t-il une requête? –

+0

Cela dépend du navigateur et de ce qui a été fait jusqu'à maintenant. Vous pouvez configurer la plupart des navigateurs pour qu'ils ne soient pas mis en cache et ils seront donc toujours rechargés. Il y a une métatag HTML pour la mise en cache, mais en respectant cela est dans le navigateur. – BobBrez

-1

Le navigateur charge la dernière page affichée avant celle en cours, puis suit toute redirection qui peut se produire?

Je semble ne pas avoir compris le but de la question.

+0

Ils veulent probablement désactiver le bouton de retour - ou empêcher son utilisation. Bonne chance. –

5

J'aime à penser à ré-émettre ma dernière demande. Si vous avez effectué un simple GET, il retournera probablement la même chose que la dernière fois (moins le contenu dynamique). Si vous avez effectué un test POST, vous devez renvoyer le formulaire (après confirmation) au serveur.

1

Un historique des pages consultées est conservé sous forme de pile. Lorsque vous "pop" les trois premières pages (A, B, C, par exemple) et que vous passez ensuite à une autre page D, vous ne pouvez plus accéder à B en appuyant sur la touche.

2

Je pense que la meilleure façon d'expliquer cela est en pseudocode:

class Page: 
    String url, ... 
    Page previous, next # implements a doubly-linked list 

class History: 
    Page current # current page 

    void back(): 
     if current.previous == null: 
      return 
     current = current.previous 
     refresh() 

    void forward(): 
     if current.next == null: 
      return 
     current = current.next 
     refresh() 

    void loadPage(Page newPage): 
     newPage.previous = current 
     current.next = newPage # remove all the future pages 
     current = current.next 
     display(current) 
0

En tant que devoloper, vous devez vous assurer que votre webapp fonctionne quelle que soit la façon dont le navigateur gère le bouton Précédent :-) Est-ce qu'il renvoie la requête? La nouvelle demande est-elle identique à l'ancienne ou est-elle différente? Le navigateur demandera-t-il à l'utilisateur de confirmer le re-POST? Quels éléments de la page seront re-demandés et que chargera à partir du cache? Le navigateur respectera-t-il mes en-têtes de contrôle de cache?

Les réponses à ces questions dépendent de la marque, de la version du navigateur et des paramètres de l'utilisateur. Concevez votre logiciel de sorte que tout cela n'a pas tellement d'importance.

Désolé pour une réponse pas très directe, mais il y a déjà des réponses claires ici.

+0

Hélas, en tenant compte de tous les effets possibles du bouton retour, quelque chose qui rend fou la plupart des développeurs, moi-même inclus. – Louise

0

un navigateur toujours stocké dans les pages de son souvenir et quand on appuie sur le bouton de retour ne pas envoyer la demande au serveur pour la page précédente à la place il juste voir son cache où il a stocké les pages et suivre la LIFO règle c'est pourquoi il nous donne cette première page en appuyant sur le bouton de retour que nous avons ouvert dans le dernier

+2

Non, ça ne marche pas! Si le cache n'est plus valide, il renvoie une requête au serveur pour récupérer la page. –

Questions connexes