«window.location.hash = location.hash» не работает в Webkit (Safari & Chrome) - PullRequest
7 голосов
/ 07 августа 2011

Я не могу заставить window.location.hash = location.hash работать в Safari.

Я использую JavaScript, чтобы обернуть содержимое моей страницы с помощью прокручиваемого DIV, расположенного под панелью навигации на моей веб-странице.Так как расположение полосы прокрутки сбрасывается при запуске javascript, я теряю исходное местоположение хеша, которое установил URL.Мне нужно повторно определить местоположение хеша без перезагрузки страницы с использованием JavaScript, поэтому я использую window.location.hash = location.hash.Он работает в IE8, Firefox и Opera, но не работает в Safari.(Я предполагаю, что Chrome тоже, но я не проверял).Есть предложения?

Подсказка: мне нравится jQuery.

Ответы [ 5 ]

11 голосов
/ 08 августа 2011

Webkit имеет две странности, которые мешают window.location.hash = location.hash нормально работать.

  1. Webkit отвечает window.location.href вместо window.location.hash (как и все другие браузеры). Любопытно, что webkit все еще может прочитать тег hash URL, используя location.hash
  2. В Webkit есть задокументированная ошибка, когда href location необходимо дважды установить в одно и то же место, прежде чем браузер перейдет в новое место. Сообщение об ошибке здесь .

Этот код решил мою проблему: (с использованием 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;
        }
    }
};
6 голосов
/ 16 марта 2016

Я получил

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

Это прекрасно работало во всех браузерах для настольных компьютеров, которые я тестировал на iOS и Android, а также на Chrome.

0 голосов
/ 17 апреля 2019
go_hash('#home')

Функция ...

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
}
0 голосов
/ 07 августа 2011

Прежде чем JavaScript изменит исходное местоположение хеша, получите позицию прокрутки, используя

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

. Если вы хотите восстановить местоположение прокрутки, используйте

$(window).scrollTop(st);
0 голосов
/ 07 августа 2011

Сначала установите location.hash во что-то другое и немедленно установите его обратно.

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