Подтвердить что ты не робот

Можно ли обновить window.location.hash без прокрутки веб-страницы?

Используя JavaScript, есть ли способ обновить window.location.hash без прокрутки веб-страницы?

У меня есть интерактивные элементы заголовка, которые переключают видимость div непосредственно под ними. Я хочу, чтобы панель /foo # отображалась в истории при нажатии заголовков, но не нужно прокручивать страницу. Поэтому, когда вы переходите от /foo # bar, я смогу использовать кнопку "Назад" и иметь div, идентификатор которого находится в window.location.hash, будет видимым после возврата.

Возможно ли такое поведение?

4b9b3361

Ответ 1

Такое поведение очень возможно. Вы должны изучить некоторые из разработанных библиотек, чтобы предоставить вам эту функциональность.

Действительно простая история: http://code.google.com/p/reallysimplehistory/ SWFAddress: http://www.asual.com/swfaddress/

Ответ 2

Как легко получить

var scrollmem = $('html,body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);

Ответ 3

Чтобы изменить хеш без перезагрузки/прокрутки страницы, теперь вы можете просто использовать html5 history.pushState.

history.pushState(null,null,'#hashexample');

Он поддерживается всеми основными браузерами:

http://caniuse.com/history

MDN:

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history#The_pushState().C2.A0method

Также обратите внимание, что последний параметр url, который мы здесь используем, может быть любым URL-адресом, поэтому он не ограничивается хешей.

Ответ 4

Еще одна вещь, которую вы могли бы попробовать - это изменить идентификатор элемента, который хэш указывает на временное. Работал для меня!

function changeHashWithoutScrolling(hash) {
  var id = hash.replace(/^.*#/, ''),
      elem = document.getElementById(id)
  elem.id = id+'-tmp'
  window.location.hash = hash
  elem.id = id
}

Ответ 5

Хотелось бы добавить комментарий к Catherines, но у меня пока нет репутации -

Отличное решение, но оно не работало для меня в Chrome как $('html'). scrollTop() всегда возвращает 0 - незначительное редактирование устраняет проблему:

scrollmem = $('html').scrollTop() || $('body').scrollTop();
window.location.hash = hash;
$('html,body').scrollTop(scrollmem);

Ответ 6

В ответ на запрос от Sunny я сделал эту функцию, которая также избегает undefined и nulls:

    function changeHashWithoutScrolling(hash) {
        var id;
        var elem;

        id = hash.replace(/^.*#/, '');

        if (id) {
            elem = document.getElementById(id);

            if (elem) {
                elem.id = id + '-tmp';
                window.location.hash = hash;
                elem.id = id;
            }
        }
    }