Обнаружение кнопки возврата / изменения хэша в URL-адресе

Я только что создал свою новую домашнюю страницу по адресу http://ritter.vg. Я использую jQuery, но очень минимально.
Он загружает все страницы с помощью AJAX - я настроил его, чтобы разрешить закладку, обнаружив хэш в URL-адресе.

 //general functions
 function getUrl(u) {
      return u + '.html';
 }
 function loadURL(u)    {
      $.get(getUrl(u), function(r){
                $('#main').html(r);
           }
      );
 }
 //allows bookmarking
 var hash = new String(document.location).indexOf("#");
 if(hash > 0)
 {
      page = new String(document.location).substring(hash + 1);
      if(page.length > 1)
        loadURL(page);
      else
        loadURL('news');
 }
 else
      loadURL('news');

Но я не могу заставить работать кнопки назад и вперед.

Есть ли способ определить, когда была нажата кнопка возврата (или определить, когда хэш изменился), без использования цикла setInterval? Когда я попробовал те, у которых таймауты 0,2 и 1 секунда, мой ЦП был привязан.


person Tom Ritter    schedule 06.10.2008    source источник
comment
Вместо того, чтобы стремиться к событию HTML4 hashchange; теперь есть HTML5 History API, который его расширяет. Вот хорошая ссылка.   -  person balupton    schedule 07.03.2011


Ответы (7)


Вместо этого используйте плагин jQuery hashchange event. Что касается полноценной навигации с использованием ajax, попробуйте использовать дружественный к поисковой оптимизации ajax. В противном случае ваши страницы ничего не отображали в браузерах с ограничениями JavaScript.

person Komang    schedule 06.10.2008
comment
В настоящее время для этого можно использовать HTML5 API. - person Drew Noakes; 02.04.2013

Все ответы здесь довольно старые.

В мире HTML5 следует использовать событие onpopstate.

window.onpopstate = function(event)
{
    alert("location: " + document.location + ", state: " + JSON.stringify(event.state));
};

Or:

window.addEventListener('popstate', function(event)
{
    alert("location: " + document.location + ", state: " + JSON.stringify(event.state));
});

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

person Drew Noakes    schedule 06.12.2012

jQuery BBQ (кнопка "Назад" и библиотека запросов)

Высококачественный плагин истории браузера на основе хэшей и очень много актуально (26 января 2010 г.) на момент написания (jQuery 1.4.1).

person micahwittman    schedule 03.02.2010

HTML5 включает гораздо лучшее решение, чем использование hashchange, которое представляет собой API управления состоянием HTML5 - https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history - они позволяют изменять URL-адрес страницы без использования хешей!

Хотя функция состояния HTML5 доступна только для браузеров HTML5. Поэтому вы, вероятно, захотите использовать что-то вроде History.js, которое обеспечивает обратную совместимость с браузерами HTML4 ( через хеши, но по-прежнему поддерживает данные и заголовки, а также функцию replaceState).

Подробнее об этом можно прочитать здесь: https://github.com/browserstate/History.js.

person balupton    schedule 30.01.2011

Еще одна замечательная реализация - jQuery History компании Balupton, которая будет использовать собственное событие onhashchange, если оно поддерживается браузер, в противном случае он будет использовать iframe или интервал соответствующим образом для браузера, чтобы обеспечить успешную эмуляцию всех ожидаемых функций. Он также предоставляет удобный интерфейс для привязки к определенным состояниям.

Также стоит отметить еще один проект - jQuery Ajaxy, который в значительной степени является расширением для истории jQuery, которое можно добавить ajax в микс. Когда вы начинаете использовать ajax с хешами, это становится довольно сложным !

person balupton    schedule 28.08.2010

Я делаю следующее: если вы хотите его использовать, вставьте его где-нибудь и установите свой код обработчика в locationHashChanged (qs), где прокомментировано, а затем вызывайте changeHashValue (hashQuery) каждый раз, когда вы загружаете запрос ajax. Это не быстрый ответ, и его нет, поэтому вам нужно подумать об этом и передать разумные аргументы hashQuery (например, a = 1 и b = 2) для changeHashValue (hashQuery), а затем обслужить каждую комбинацию указанных аргументов в вашем местоположении (qs) обратный вызов ...

// Add code below ...
function locationHashChanged(qs)
{
  var q = parseQs(qs);
  // ADD SOME CODE HERE TO LOAD YOUR PAGE ELEMS AS PER q !!
  // YOU SHOULD CATER FOR EACH hashQuery ATTRS COMBINATION
  //  THAT IS PASSED TO changeHashValue(hashQuery)
}

// CALL THIS FROM YOUR AJAX LOAD CODE EACH LOAD ...
function changeHashValue(hashQuery)
{
  stopHashListener();
  hashValue     = hashQuery;
  location.hash = hashQuery;
  startHashListener();
}

// AND DONT WORRY ABOUT ANYTHING BELOW ...
function checkIfHashChanged()
{
  var hashQuery = getHashQuery();
  if (hashQuery == hashValue)
    return;
  hashValue = hashQuery;
  locationHashChanged(hashQuery);
}

function parseQs(qs)
{
  var q = {};
  var pairs = qs.split('&');
  for (var idx in pairs) {
    var arg = pairs[idx].split('=');
    q[arg[0]] = arg[1];
  }
  return q;
}

function startHashListener()
{
  hashListener = setInterval(checkIfHashChanged, 1000);
}

function stopHashListener()
{
  if (hashListener != null)
    clearInterval(hashListener);
  hashListener = null;
}

function getHashQuery()
{
  return location.hash.replace(/^#/, '');
}

var hashListener = null;
var hashValue    = '';//getHashQuery();
startHashListener();
person Eugene Kerner    schedule 18.04.2011
comment
Используется только для изменения активной ссылки при использовании якорей для навигации по моей странице. - person Chaim; 02.06.2011

Попробуйте простую и легкую PathJS lib.

Простой пример:

Path.map("#/page").to(function(){
    alert('page!');
});
person Nikita Koksharov    schedule 19.04.2012