ハッシュやページの再読み込みなしで新しいURLでアドレスバーを更新する


644

私は、ページをリロードせずにJavaScript(ドメインではなくパス)を介してアドレスバーを更新する方法を実装するクロム(開発チャネル)を夢見ていたか、実際にこれを実行しました。

しかし、読んだと思う記事が見つかりません。

私は狂っていますか、これを行う方法はありますか(Chromeで)?

PS私はwindow.location.hashなどについて話していません。上記が存在する場合、この質問に対する答えは正しくありません。



1
@tobiaskienzlerその質問が最初に2009年に尋ねられたとき、それは不可能でした。
David Murdoch

3
もちろん違います。しかし今はそうです、質問は同じことを求めます。もう一方が古い回答を受け入れたのは残念ですが(あなたは、私が気づきました)...あなたは何を知っていますか?逆に二重に閉じてみましょう。「元の」は古いものでなければならないという人は誰もいませんでした。実際には先例があります
トビアスキエンツラー

@tobiaskienzler、他の質問には古い承認された回答がありません。
David Murdoch

2
@TobiasKienzlerそれは6年前の質問です、なぜあなたはこの質問に悩む必要がありますか?すばらしい答えを楽しんで、アプリケーションに実装してください。6年間、何千人ものSOユーザーが素晴らしい質問だと同意しました。そのままにしておいてください。
イマームAssidiqqi 2016

回答:


875

これで、ほとんどの「モダン」ブラウザでこれを実行できます。

これが私が読んだ元の記事です(2010年7月10日):HTML5:ページを更新せずにブラウザーのURLを変更します

pushState / replaceState / popstate(別名HTML5 History API)の詳細については、MDNドキュメントをご覧ください

TL; DR、これを行うことができます:

window.history.pushState("object or string", "Title", "/new-url");

基本的なハウツーについては、ページリロードせずにURL変更するための私の回答を参照してください。


3
ああ、機能はWebKitにあり、数か月前にリリースされました < bugs.webkit.org/show_bug.cgi?id=36152 >。素敵な発見!
oldestlivingboy 2010

6
これは現在、githubによって使用されていますが、ツリーナビゲーション
Valerij

1
@Vprimachenko:うん。そして、彼らはたまに私の戻るボタンを壊します。
デビッドマードック

これは、Chrome、Safari、FF4 +、およびIE10pp3 +で実行できるようになりました。(David Murdochのstackoverflow.com/questions/824349/…への回答より )
Zach Lysobey

11
Protip:あなたは、例えば(同様にこれらの機能を相対パスを使用することができます../new-url../../new-url彼らはあなたが少なくともChromeで期待されるものを行うように見える。。
Mahn

156

ハッシュの後だけを変更する-古いブラウザ

document.location.hash = 'lookAtMeNow';

完全なURLを変更しています。Chrome、Firefox、IE10 +

history.pushState('data to be passed', 'Title of the page', '/test');

上記は履歴に新しいエントリを追加するので、戻るボタンを押して前の状態に戻ることができます。履歴に新しいエントリを追加せずにURLを変更するには

history.replaceState('data to be passed', 'Title of the page', '/test');

これらをコンソールで実行してみてください!


13
replaceState元の応答を拡張してくれてありがとう。
Choylton B. Higginbottom

「ドメインとプロトコルはオリジナルと同じである必要があります!」これにより、一部の釣りサイトがアドレスバーのURLを変更できなくなります。
リック

3
この関数には絶対URLを渡さないでください。その場合、現在のスキーム、ホスト、ポートから動的にビルドする必要がある可能性が高く、これを相対URL( "foo.html"または "/foo.html ")そして、ブラウザに処理を任せます。
DimeCadmium

1
@DimeCadmium素敵な簡素化。更新しました。
パヴェル

history.replaceStateff 66.0b1の履歴に追加
azzamsa

33

Davidの回答を更新して、pushstateをサポートしていないブラウザーを検出することもできます。

if (history.pushState) {
  window.history.pushState("object or string", "Title", "/new-url");
} else {
  document.location.href = "/new-url";
}

9
document.location.hrefはページをリロードします
paullb

1
var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?foo=bar';
window.history.pushState({path:newurl},'',newurl);

3
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の質を高めるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
MaxiMouse

@MaxiMouse誠実にお礼を申し上げます。
ケビンメンデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.