Как сделать кнопку "Назад" в браузере на сайт с AJAX?


Исследовал эту тему год назад, когда я сделал сайт, с ресурсов типа $.load() и $.ajax() в AJAX/jQuery, но я не мог ничего удовлетворительным, что не был слишком сложным, и даже сегодня-сайта назад на главную страницу, когда пользователь нажимает на кнопку Voltar браузера.

Какой бы простой способ, чтобы восстановить предыдущее состояние до браузера получить новые данные через AJAX?

Какой лучший метод для "печатать" на URL-адрес браузера изменения в отношении к цели, что AJAX ищет? то же, что происходит, когда вы нажимаете на изображение в Facebook и он меняет URL-адрес, даже получив данные через AJAX.

я Хотел бы использовать URL-адреса в том же стиле, в котором я делаю вызовы ajax: dominio.com/aplicativo/controlador/ação/parâmetros вместо того, чтобы использовать #.

Author: Maniero, 2014-02-06

4 answers

Введение

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

Таким образом, что, фактически, позволяет проводить этот вид обработки без обновления страницы (refresh), через использование hash локализации.

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


Потребностями

, позволяющее регулировать hash текущее местоположение в браузере, есть три требования основные:

  • Читать: Собирать и обрабатывать значения hash в текущем местоположении;
  • Написания: Обновите hash в текущем местоположении с нужным значением;
  • Прослушивания: Определить, когда было проведено изменение hash, и действовать соответственно.

Давайте посмотрим, как справиться с каждым из этих требований:

  • Читать

    , Собирайте hash расположение

    Читать hash текущего местоположения, мы можем использовать JavaScript и прочитать значение свойства window.location.hash. Первый символ будет всегда индикатор хэш #, что может быть удален.

    // ler valor e "cortar" o primeiro caractere
    var hashValue = window.location.hash.substring(1);
    

    , вопросов эффективности, давайте создадим функцию, для лечения этого действия:

    /**
     * Devolve a hash da localização actual
     * @return {string} Valor da Hash com prefixo '#' ignorado.
     */
    function lerHash () {
      return window.location.hash.substring(1);
    }
    
  • Писать

    Вводе значения в hash расположение

    Обновлять hash текущее местоположение отеля браузер программными средствами, мы обратились снова в JavaScript и свойства window.location.hash:

    // atribuir valor à hash
    window.location.hash = 'pagina2';
    

    , Еще раз, для большей эффективности, давайте создадим функцию, для лечения этого действия:

    /**
     * Actualiza a hash da localização actual com o valor facultado
     * @param {string} str
     */
    function escreverHash(str) {
      window.location.hash = str;
    }
    
  • Прослушивание

    Прослушивание и обнаружить изменения в hash текущее местоположение браузер

    Браузер удобно запускает событие всякий раз, когда hash текущее местоположение обновлен или изменен. Для того, чтобы быть начеку это обновление и despoletarmos действие по новое значение, присвоенное, мы просто должны настроить обработчик событий с помощью JavaScript, чтобы слушать это событие:

    /**
     * Escuta alterações na hash da localização actual.
     * @param {Event} e HashChangeEvent object
     */
    window.onhashchange = function(e) {
      // Fazer algo quando existe uma alteração de valor
      // ...
    };
    

Пользой hash, чтобы разрешить состоянии "постоянных" на веб -

, Чтобы понимать немного, как все работает за кулисами, давайте рассмотрим следующую схему:

Sequência de Acções

  • Последовательность действий: Цвет Красный

    , Здесь показано,-нормальное поведение браузера, без выполнения требований, которые мы видели выше:

    • Пользователь взаимодействует со страницей;
    • страницу обновлении hash, чтобы открыть новую запись в журнал посещений;
    • update hash вызывает появление события, что, в свою очередь, будет вызывать функцию манипулятивных;
    • манипулятивной Функции ничего не делает.
  • Последовательности действие B: Зеленый Цвет

    , Здесь показано, что происходит с приложением требования, которые мы изучаем на вершине:

    • обновлении адреса в браузере или обратиться к нашим кнопки "Назад/Вперед" из собственного браузера;
    • update hash вызывает появление события, что, в свою очередь, будет вызывать функцию манипулятивных;
    • манипулятивной Функции будет выполнять функции нашей обновите страницу;
    • обновлении Страницы и больше ничего не происходит (нет refresh).

Практическом Примере

Как на свой вопрос не у вас нет кода, чтобы лучше проиллюстрировать твой сценарий, практически, к любой ответ на твой случай, в частности, находится здесь общий пример.

В Этом примере веб-страницы, имитирует вставки содержимого с помощью Ajax и обрабатывает элементы, которые будут представлены пользователю, в то время как идет создание новых записей в история местоположений браузера, чтобы использовать кнопки "Назад" или "Вперед", не вызывая обновление (refresh):

<!doctype html>
  <html>
    <head>
      <meta charset="UTF-8">
      <title>Exemplo de navegação sem actualização da página</title>
    </head>
    <body>
      <nav>
        <ul>
          <li id="pagina1">
            Página 01
          </li>
          <li id="pagina2">
            Página 02
          </li>
          <li id="pagina3">
            Página 03
          </li>
          <li id="pagina4">
            Página 04
          </li>
        </ul>
      </nav>
      <section>
        Olá, bem vindo à Página 01!
      </section>

      <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

      <script type="text/javascript">

        function cumprimenta(pagina){

          $('section').delay(100).html( "Olá, bem vindo à " + $('#'+pagina).html() );

          $('nav li').css("color", "black");
          $this.css("color", "green");
        }

        function oraBolas() {
          $('section').delay(100).html( "Existe qualquer coisa de errado!" );
        }

        /**
         * Escuta alterações na hash da localização actual.
         * @param {Event} e HashChangeEvent object
         */
        window.onhashchange = function(e) {

          var pagina = lerHash();

          // aqui chama-se função X mediante o valor da variável "pagina"

          if (pagina.length==7)
            cumprimenta(pagina);
          else
            oraBolas();
        };

       /**
        * Actualiza a hash da localização actual com o valor facultado
        * @param {string} str
        */
       function escreverHash(str) {
         window.location.hash = str;
       }

       /**
        * Devolve a hash da localização actual
        * @return {string} Valor da Hash com prefixo '#' ignorado.
        */
       function lerHash () {
         return window.location.hash.substring(1);
       }

       $(function() {

         $('nav').on("click", 'li', function (e) {
           e.preventDefault();
           escreverHash($(this).attr("id"));
         });
       });
     </script>
   </body>
</html>

Завершения

Таким образом, , манипулируя hash, можете навигации соответствует всем веб-сайт, либо путем использования ссылки, присутствующие на странице в настоящее время отображается на экране, либо использовать стрелки "Назад" и "Далее", самого браузера.

, работа вся осуществляется слушателя события изменения hash, где здесь должен быть вызов соответствующих функций, которые будут вызывать поведение или изменений.

Я Думаю, что удастся решить таким образом две проблемы в вопросе:

  • Направить посетителя в определенной области без refresh;
  • Гарантировать, что, если посетитель использовать стрелки навигации, имеющихся в собственный браузер, веб-сайт поможет вам представить страницу предыдущей далее как и ожидалось, опять без refresh.
 12
Author: Zuul, 2014-02-06 14:19:28

Хотя я не знаю достаточно, чтобы углубиться в тему, есть ли такая библиотека history.js что предлагает различные методы, чтобы манипулировать историей браузера, который работает как с html5, как html4.

Код из документации к библиотеке:

(function(window,undefined){

    // Bind para o evento StateChange 
    History.Adapter.bind(window,'statechange',function(){ // Nota: Estamos usando statechange em vez de popstate
        var State = History.getState(); // Nota: Estamos usando History.getState() em vez event.state
    });

    // Modificando os Estados
    History.pushState({state:1}, "State 1", "?state=1"); // cria {state:1}, "State 1", "?state=1"
    History.pushState({state:2}, "State 2", "?state=2"); // cria {state:2}, "State 2", "?state=2"
    History.replaceState({state:3}, "State 3", "?state=3"); // cria {state:3}, "State 3", "?state=3"
    History.pushState(null, null, "?state=4"); // cria {}, '', "?state=4"
    History.back(); // acessa {state:3}, "State 3", "?state=3"
    History.back(); // acessa {state:1}, "State 1", "?state=1"
    History.back(); // acessa {}, "Home Page", "?"
    History.go(2); // acessa {state:3}, "State 3", "?state=3"

})(window);

Идея здесь, вы не могли бы создать pushState, чтобы каждая вызов AJAX, который вы делаете. Таким образом, когда пользователь нажимает на кнопку Назад он вернется в состояние, созданный ранее.

- Прежнему, вполне можно использовать url-адреса, как вы упомянули:

History.pushState({state: 1}, "Editar 1", "editar/1"); 

И браузера будет отображаться на панели навигации http://seudominio.com/controller/editar/1

 5
Author: iuristona, 2014-02-06 13:21:05

Решение прямой API истории HTML5 -

history.pushState( estado, titulo, url );

, Чтобы сделать код более полный и лучший опыт для пользователя, вы можете реализовать popstate при изменении содержимого, так что клавиша "backspace" или кнопки "назад" в браузере работает правильно, возвращаясь в прежнее положение, в соответствии с их осуществления:

window.addEventListener( "popstate", function(e) {
   // Aqui vai o código para voltar ao estado anterior da navegacao
});

Первый параметр, с pushState упоминалось ранее (состояния), служит именно для того чтобы сохранить данные, которые вы хотите, чтобы иметь возможность использовать в функции выше. Если вы предпочитаете, вы можете обрабатывать URL-адрес напрямую, а не использовать положение/state.

И Вот в один прекрасный учебник по этой ссылке: http://diveintohtml5.info/history.html (en)

Здесь, демо галерея фотографий на ajax, с историей, и их source.

Отметить, что в браузерах старше, Url работает отлично, даже без Ajax.

 4
Author: Bacco, 2014-06-11 08:51:10

Для этого вам нужно auterar URL-адрес так, чтобы браузер действительно снова. В случае, если AJAX я знаю двух формах, одна с комментариями URL, известный хэш (#) или другой метод, который я думаю, более организованным, хотя вы должны были бы относиться к URL's также .htaccess файл, в этом случае можно использовать History API, более конкретно, history.pushState - это способ изменить URL-адрес без перенаправления браузера.

Первый случай прост:

Location.hash = '!/тест/lorem-ipsum'

Примечание: Я Использовал "!"ради индексировать динамический контент, google заменяет "#!"почему "?_escaped_fragment_=" индексировать динамический контент. Вы можете прочитать больше об этом по адресу: https://developers.google.com/webmasters/ajax-crawling/docs/specification

Простой пример второго случая будет иметь вид:

history.pushState(null, null, 'teste/lorem-ipsum');

Этот сценарий уже бы изменить URL-адрес, и вы можете использовать события API для запуска AJAX, когда URL-адрес страдать от этого изменения, в этом случае событие window.onpopstate.

 3
Author: Diego Lopes Lima, 2014-02-06 13:01:03