41

現在のページを別の URL ハッシュでリロードしようとしていますが、期待どおりに動作しません。

(どのように機能させたいかを明確にする:ページをリロードしてから、新しいハッシュまでスクロールします。)

アプローチ #1:

window.location.hash = "#" + newhash;

ページをリロードせずに、このアンカーまでスクロールするだけです。

アプローチ #2:

window.location.hash = "#" + newhash;
window.location.reload(true);

ちょっと動作しますが、最初にアンカーまでスクロールし、次にページをリロードしてから、再びアンカーまでスクロールします。

アプローチ #3:

window.location.href = window.location.pathname + window.location.search + "&random=" + Math.round(Math.random()*100000) + "#" + newhash;

動作しますが、ランダムなガベージを URL に追加したくありません。

より良い解決策はありますか?

4

4 に答える 4

34

移動先のアンカーを削除してから、アプローチ 2 を使用しますか? アンカーがないため、ハッシュを設定してもページはスクロールされません。

于 2009-10-19T16:51:59.190 に答える
2

#fooがID「foo」のアンカーまでスクロールすることを期待する必要があります。アプローチ#1を使用してリロードする場合は、このアプローチが機能する可能性があります。

if (Object.defineProperty && Object.getOwnPropertyDescriptor) { // ES5
    var hashDescriptor = Object.getOwnPropertyDescriptor(location, "hash"),
    hashSetter = hashDescriptor.set;
    hashDescriptor.set = function (hash) {
        hashSetter.call(location, hash);
        location.reload(true);
    };
    Object.defineProperty(location, "hash", hashDescriptor);
} else if (location.__lookupSetter__ && location.__defineSetter__) { // JS
    var hashSetter = location.__lookupSetter__("hash");
    location.__defineSetter__("hash", function (hash) {
        hashSetter.call(location, hash);
        location.reload(true)
    });
}
于 2009-10-19T19:27:43.570 に答える