2011-01-17 5 views
18

на моем сайте я установить URL-адрес адрес с помощьюwindow.location.hash = ""; предотвратить прокрутку вверх?

window.location.hash = 'project_name'; 

, но если я хочу, чтобы очистить Адрес URL из любых хэшей (когда я закрыть проект) и я установить

window.location.hash = ''; 

это случается прокрутки страницы вверху страницы

Есть ли способ очистить URL-адрес без какого-либо побочного эффекта?

благодаря

+0

Вы можете назначить несуществующий якорь, но это на самом деле не «очищать» URL вверх: D – polarblau

ответ

28

Там в onhashchange событие, но оно не может быть отменено надежно во всех браузерах, чтобы предотвратить прокрутку. Лучшим решением является запись положения прокрутки перед изменением местоположения хэша и последующим сбросом. Например, следующий код будет поймать нажмите на любую ссылку - это не остановить распространение - с HREF значением # и предотвратить страницу от прокрутки по вертикали:

document.onclick = function (evt) { 
    var tgt = (evt && evt.target) || event.srcElement, 
     scr = document.body.scrollTop; 

    if (tgt.tagName == "A" && tgt.href.slice(-1) == "#") { 
     window.location.href = "#"; 
     document.body.scrollTop = scr;   
     return false; 
    } 
} 

Если вы изменяете хэш через скрипт, вы можете использовать следующий код:

var scr = document.body.scrollTop; 
window.location.href = '#'; 
document.body.scrollTop = scr; 

Любой из этих методов может быть отрегулирован, чтобы избежать прокрутки отдельных элементов или горизонтально прокрутки страницы. Обратите внимание, что вы можетеremove the entire hash (включая #), не вызывая навигации или прокрутки в современных браузерах, вызывая функции pushState или replaceState.

+1

интересно ... каждый день я узнаю что-то! thanks – Francesco

+0

Вы также можете временно создать другой элемент с этим 'id' в' scrollTop'. – alex

+0

fyi, он не работает в Firefox и только в Chrome.Он попадает в функцию ohhashchange, но браузер все еще прокручивает (также пытается предотвратить по умолчанию). – JCarter

12

У меня была такая же проблема, и я пришел сюда для ответа. Только что узнал, есть очень простой способ:

window.location.hash = ' '; 

основном Вы настраиваете его на «#», так как пространство не существует, он не двигается. Когда вы пересматриваете страницу, она также не относится к ней иначе, чем просто #

+0

Это должен быть принятый вопрос, на мой взгляд, – Nico

+1

s/question/answer/ – nicolallias

+0

приятное решение, но не работает в хроме 46 – meteor

8

Прежде всего, спасибо за ваши решения - @ Andy-E и @JustMaier.

Однако у меня была проблема с его работой, основанной на втором блоке кода Andy E в Firefox и коде JustMaier в хроме.

Так что я сделал пюре из этих двух кодовых блоков и она работает так же, как предполагалось на обоих браузерах

var scr = document.body.scrollTop; 

window.location.hash = ' '; 

document.body.scrollTop = scr; 


Моих два цента, не взяв ничего от настоящих ниндзя JS, упомянутым выше. :)

0

document.body.scrollTop is deprecated, а также последние версии Chrome, по-видимому, нестабильны. Должно работать:

var topPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; 
    window.location.href = '#'; 
    document.documentElement.scrollTop = topPos;