How can I update window.location.hash without jumping the document?
There is a workaround by using the history API on modern browsers with fallback on old ones:
if(history.pushState) {
history.pushState(null, null, '#myhash');
}
else {
location.hash = '#myhash';
}
Credit goes to Lea Verou
Can I update window.location.hash without having the web page scroll?
This behavior is very much possible. You should look into some of the libraries that have been developed to give you this functionality.
Really Simple History: http://code.google.com/p/reallysimplehistory/
SWFAddress: http://www.asual.com/swfaddress/
Modifying location.hash without page scrolling
I think I may have found a fairly simple solution. The problem is that the hash in the URL is also an element on the page that you get scrolled to. if I just prepend some text to the hash, now it no longer references an existing element!
$(function(){
//This emulates a click on the correct button on page load
if(document.location.hash){
$("#buttons li a").removeClass('selected');
s=$(document.location.hash.replace("btn_","")).addClass('selected').attr("href").replace("javascript:","");
eval(s);
}
//Click a button to change the hash
$("#buttons li a").click(function(){
$("#buttons li a").removeClass('selected');
$(this).addClass('selected');
document.location.hash="btn_"+$(this).attr("id")
//return false;
});
});
Now the URL appears as page.aspx#btn_elementID
which is not a real ID on the page. I just remove "btn_" and get the actual element ID
How can I remove the location hash without causing the page to scroll?
I believe if you just put in a dummy hash it won't scroll as there is no match to scroll to.
<a href="#A4J2S9F7">No jumping</a>
or
<a href="#_">No jumping</a>
"#"
by itself is equivalent to "_top"
thus causes a scroll to the top of the page
window.location.hash = ; prevent scrolling to the top?
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.
Change hash without reload in jQuery
This works for me
$('ul.questions li a').click(function(event) {
event.preventDefault();
$('.tab').hide();
window.location.hash = this.hash;
$($(this).attr('href')).fadeIn('slow');
});
Check here http://jsbin.com/edicu for a demo with almost identical code
How can I replace a window's URL hash with another response?
Either use location
or window.location
instead of document.location
as the latter is a non-standard.
window.location.hash = '#food';
This will replace the URL's hash with the value you set for it.
Reference
How to remove the hash from window.location (URL) with JavaScript without page refresh?
Initial question:
window.location.href.substr(0, window.location.href.indexOf('#'))
or
window.location.href.split('#')[0]
both will return the URL without the hash or anything after it.
With regards to your edit:
Any change to window.location
will trigger a page refresh. You can change window.location.hash
without triggering the refresh (though the window will jump if your hash matches an id on the page), but you can't get rid of the hash sign. Take your pick for which is worse...
MOST UP-TO-DATE ANSWER
The right answer on how to do it without sacrificing (either full reload or leaving the hash sign there) is up here. Leaving this answer here though with respect to being the original one in 2009 whereas the correct one which leverages new browser APIs was given 1.5 years later.
Related Topics
Capture Browser Console Logs with Capybara
Wkwebview - Complex Communication Between JavaScript & Native Code
How to Find All Subsets of a Set in JavaScript? (Powerset of Array)
In iOS8 Using .Focus() Will Show Virtual Keyboard and Scroll Page After Touch
Preloader Wont Ignore Websocket - Pace Js
Encrypt iOS and Decrypt Node.Js Aes
IE8 Var W= Window.Open() - "Message: Invalid Argument."
Merge Keys Array and Values Array into an Object in JavaScript
How to Remove a Character from a String Using JavaScript
How to Include Newlines in Labels in D3 Charts
How to Invoke Ruby from Node.Js
How to Implement Jquery.Noconflict()
What Is the "Best" Way to Get and Set a Single Cookie Value Using JavaScript
Shiny: Passing Reactivevalues to Conditionalpanel
How to Set a JavaScript Object Values Dynamically
Alternative to Jquery's .Toggle() Method That Supports Eventdata