Как работает кнопка «Назад» в веб-браузере? - PullRequest
80 голосов
/ 21 августа 2009

Я искал в Интернете этот вопрос, но ничего не нашел:

Какова логика кнопки возврата? Что происходит, когда мы нажимаем кнопку «Назад» в веб-браузере?

Я действительно хотел бы больше узнать об этом.

Спасибо.

Ответы [ 8 ]

92 голосов
/ 21 августа 2009

Ваш веб-браузер хранит стопку (или список, если хотите) веб-страниц, которые вы посетили в этом окне. Допустим, вашей домашней страницей является google.com, а оттуда вы посещаете несколько других веб-сайтов: youtube.com, yahoo.com и cnn.com. При посещении последнего, список выглядит так:

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

Когда вы нажимаете кнопку «Назад», браузер возвращает вас на предыдущую страницу в списке, например:

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

В этот момент вы можете снова нажать Назад, чтобы перейти на youtube.com, или нажать Вперед, чтобы снова попасть на cnn.com. Допустим, вы нажимаете кнопку Назад во второй раз:

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

Если вы сейчас перейдете, например, на abc.com, список изменится так:

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

Обратите внимание, что yahoo.com и cnn.com исчезли из списка. Это потому, что вы выбрали новый маршрут. Браузер поддерживает только список страниц, которые вы посетили, чтобы попасть туда, где вы сейчас находитесь, а не историю каждой страницы, на которой вы когда-либо были. Браузер также ничего не знает о структуре посещаемого вами сайта, что может привести к неожиданному поведению.

Вы находитесь на сайте покупок (например, ne.com), на котором есть категории и подкатегории товаров для просмотра. Дизайнер сайта тщательно продумал хлебные крошки в верхней части окна, чтобы вы могли перемещаться по категориям. Вы начинаете с верхней страницы сайта, нажимаете «Оборудование», затем «Память». Список теперь выглядит так:

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

Вы хотите вернуться в категорию «Оборудование», поэтому вы используете хлебные крошки, чтобы перейти в родительскую категорию, а не кнопку «Назад». Теперь список браузеров выглядит так:

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

В соответствии со структурой сайта, вы пошли назад (на уровень выше), но к браузеру вы пошли вперед, потому что вы нажали на ссылку. Каждый раз, когда вы нажимаете на ссылку или вводите URL-адрес в адресной строке, вы продвигаетесь вперед в том, что касается браузера, независимо от того, ведет ли эта ссылка на страницу, на которой вы уже были.

Наконец, вы хотите вернуться на главную страницу сайта (ne.com). Вы можете использовать хлебные крошки, но на этот раз вы нажмете кнопку «Назад» - кажется очевидным, что это должно поднять вас на один уровень, верно? Но куда это уходит?

Изначально многих пользователей (включая меня, когда я делаю именно это) поначалу сбивает с толку то, что это «понижает» вас до уровня «Память». Глядя на список страниц, легко понять, почему:

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

Чтобы вернуться на главную страницу с помощью только кнопки «Назад», потребуется еще два нажатия, чтобы вернуть вас «назад» в категорию «Оборудование» и, наконец, на главную страницу. Для программистов это кажется настолько очевидным, что происходит, но это удивляет постоянных пользователей все время, потому что они не понимают, что браузер ничего не знает об иерархической структуре любого веб-сайта, на котором они оказались.

Было бы замечательно, если бы браузеры позволяли дизайнерам сайтов программировать кнопку Назад, чтобы сделать очевидную вещь (поднять вас на уровень), а не то, что она делает сейчас?

Редактировать. Комментатор спросил, загружает ли браузер страницу или просто выводит ее из локального кэша.

Ответ - это зависит. Дизайнеры сайта могут указать, должен ли браузер кэшировать страницу или нет. Для страниц, которые настроены как некэшированные, браузер перезагружает страницу с сервера при нажатии кнопки Назад, как если бы вы впервые ее посещали. Для кэшированных страниц браузер выводит их из кэша, что намного быстрее.

5 голосов
/ 21 августа 2009

Мне нравится думать об этом, как о повторной выдаче моего последнего запроса. Если вы выполнили простой GET, он, вероятно, вернул бы то же самое, что и в прошлый раз (за исключением динамического содержимого). Если вы выполнили процедуру POST, вы отправите форму (после подтверждения) на сервер.

2 голосов
/ 21 августа 2009

Я думаю, что самый простой способ объяснить это в псевдокоде:

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)
2 голосов
/ 21 августа 2009

Основная идея - вернуться к последней странице или разделу логического сайта.

Глядя на Gmail, вы увидите, что если вы выполните поиск и нажмете сообщение, а затем нажмете кнопку «Назад», он вернет вас к поиску, который вы сделали.

Когда вы щелкаете по нему в большинстве браузеров, он либо отправляет последний http-запрос, либо загружает кеш, если браузер кэширует сайты.

1 голос
/ 21 августа 2009

История просмотра страниц хранится в виде стека. Когда вы «открываете» верхние три страницы (например, A, B, C), а затем переходите на другую страницу D, вы не можете снова попасть в B, нажимая вперед.

0 голосов
/ 02 сентября 2010

браузер всегда сохранял страницы для запоминания и когда мы нажимаем кнопку возврата он не отправляет запрос серверу на предыдущую страницу, а просто видит свой кеш где он хранит страницы, и он следует правилу LIFO, поэтому он сначала дает нам эту страницу при нажатии на кнопку «назад», которую мы открыли в последний

0 голосов
/ 22 августа 2009

Как разработчик, вы должны убедиться, что ваше веб-приложение работает независимо от того, как браузер обрабатывает кнопку «Назад». Новый запрос идентичен старому или он чем-то отличается? Будет ли браузер запрашивать у пользователя повторную отправку? Какие элементы страницы будут повторно запрошены, а какие загружены из кеша? Будет ли браузер уважать мои заголовки контроля кэша?

Ответы на эти вопросы зависят от производителя, версии браузера и пользовательских настроек. Разработайте свое программное обеспечение так, чтобы все это не имело большого значения.

Извините за не очень прямой ответ, но здесь уже есть несколько прямых ответов.

0 голосов
/ 21 августа 2009

Браузер загружает последнюю просмотренную страницу перед текущей, а затем следует любое перенаправление, которое может произойти?

Кажется, мне не хватает сути вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...