简体   繁体   中英

“window.location.hash = location.hash” does not work in Webkit (Safari & Chrome)

I can't get window.location.hash = location.hash to work in Safari.

I'm using javascript to wrap the contents of my page with a scrollable DIV, placed below the navigation bar in my webpage. Since the scrollbar's location gets reset when the javascript runs, I'm losing the original hash location that the URL set. I need to re-cue the hash location without reloading the page using javascript, so I'm using window.location.hash = location.hash . It works in IE8, Firefox, and Opera, but it doesn't work in Safari. (I'll assume Chrome, too, but I haven't check). Any suggestions?

Hint: I like jQuery.

Webkit has two oddities that prevent window.location.hash = location.hash from working normally.

  1. Webkit responds to window.location.href instead of window.location.hash (like all the other browsers do). Curiously, webkit can still read the URL's hash tag using location.hash
  2. Webkit has a documented bug where the href location has to be set to the same location twice before the browser will go to the new location. Bug report here .

This code solved my problem: (using jQuery).

$(document).ready(function() {
    gotoHASH()
};

function gotoHASH() {
    if (location.hash) {
        if ( $.browser.webkit == false ) {
            window.location.hash = location.hash;
        } else {
            window.location.href = location.hash;
        }
    }
};

I ended up with

window.location.hash = "";
window.location.hash = "myanchor";

This worked fine in all desktop browsers I tested in and on iOS and Android chrome.

go_hash('#home')

The function...

function go_hash(hash) {
  console.log('go_hash: ' + hash)
  if(hash.indexOf('#') == -1)
    hash = '#' + hash
  if(document.location.hash) {
    document.location.hash = hash
    return
  }
  if(window.location.hash) {
    window.location.hash = hash
    return
  }
  if(document.location.href) {
    document.location.href = hash
    return
  }
  window.location.href = hash
}

Set location.hash to something else first and immediately set it back.

var t = window.location.hash;
window.location.hash = "non-existant-id";
window.location.hash = t;

Before JavaScript changes the orginal hash location, get the scroll position using

var st = $(window).scrollTop().

When you want to restore the scroll location, use

$(window).scrollTop(st);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM