window.location.hash = " "; prevent scrolling to the top?
in my website i set the url adress using
window.location.hash = 'project_name';
but if i want to clean the adress url from any hashes (when i close a project) and i set
window.location.hash = '';
it happens the page scrolls up to the top page
there is开发者_开发问答 any way to clean up the url without any side effect?
thanks
There's the onhashchange
event, but it cannot be cancelled reliably across browsers to prevent scrolling. The best solution is to record the scroll position before changing the hash location and reset it afterwards. For example, the following code will catch a click on any link ― that doesn't stop propagation ― with a href value of #
and prevent the page from scrolling vertically:
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;
}
}
If you're changing the hash through script, you can use the following code:
var scr = document.body.scrollTop;
window.location.href = '#';
document.body.scrollTop = scr;
Either of those methods can be adjusted to avoid scrolling individual elements or scrolling the page horizontally. Note that you can remove the entire hash (including the #
) without causing navigation or scrolling in modern browsers by calling the pushState
or replaceState
functions.
I was having the same problem and came here for an answer. Just found out there is a very easy way:
window.location.hash = ' ';
Basically you are setting it to '# ', since the space doesn't exist, it doesn't move. When you revisit the page, it also doesn't treat it any differently than just #
First off, thanks for your solutions - @Andy-E and @JustMaier.
However, I had a problem getting it to work based on Andy E's second code block in Firefox and JustMaier's code in chrome.
So I did a mash up of those two code blocks and it works just as intended on both browsers
var scr = document.body.scrollTop;
window.location.hash = ' ';
document.body.scrollTop = scr;
My two cents, taking nothing away from the real JS ninjas, mentioned above. : )
document.body.scrollTop is deprecated, also latest Chrome versions seem to be unstable here. The following should work:
var topPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
window.location.href = '#';
document.documentElement.scrollTop = topPos;
精彩评论