ページをリロードせずにURLを変更するにはどうすればよいですか?


2377

ページをリロードせずに現在のページのURLを変更できる方法はありますか?

できれば#ハッシュより前の部分アクセスしたいです。

ドメインのの部分を変更するだけでよいので、クロスドメインポリシーに違反しているわけではありません。

 window.location.href = "www.mysite.com/page2.php";  // Sadly this reloads

139
質問を理解しやすくするために、たとえば、写真を開いたときにFacebookがこれを実行します。URLバーはその写真を直接指すように変更されるため、サイト内のどこにいてもURLを共有できます。過去10年間のフレーミングに基づいたサイトを覚えていますか?内部フレームのみが変更されていたため、ホームページのURLしか取得できませんでした。そしてそれはひどいものでした。
Spidey

一方でhistory.pushState()、おそらくこのような状況では、ここで正しい答えであり、少なくとも、(例えばApacheののRewriteRuleディレクティブを使用して経由など)、サーバー側のリダイレクトを使用する可能性は、あなたが考慮する必要がありますものです(...正確な状況に依存する)、または注意してください。言及すべきだと思っただけです!
Doin

回答:


2033

これは、Chrome、Safari、Firefox 4以降、およびInternet Explorer 10pp4以降で実行できるようになりました。

詳細については、この質問の回答を参照してください: ハッシュなしの新しいURLでのアドレスバーの更新またはページの再読み込み

例:

 function processAjaxData(response, urlPath){
     document.getElementById("content").innerHTML = response.html;
     document.title = response.pageTitle;
     window.history.pushState({"html":response.html,"pageTitle":response.pageTitle},"", urlPath);
 }

次に、を使用window.onpopstateして、戻る/進むボタンのナビゲーションを検出できます。

window.onpopstate = function(e){
    if(e.state){
        document.getElementById("content").innerHTML = e.state.html;
        document.title = e.state.pageTitle;
    }
};

ブラウザ履歴の操作の詳細については、このMDN記事を参照してください


272
FacebookはIE7でそれをどのように行うのですか?
ドミニク2012年

57
@CHiRiLo は、HTML5履歴APIをサポートしないブラウザーにフォールバックを提供するhistory.jsをチェックアウトします。
デビッドマードック

23
@infensus URLのどこかに#記号がある場合、そのトリックは何年もの間存在していた..
Izkata

34
「IE10pp4 +」の「pp4 +」の意味は何ですか?
スコットテスラー

34
プラットフォームプレビュー4
デビッドマードック

587

HTML5にはhistory.pushState()history.replaceState()メソッドが導入されており、履歴エントリをそれぞれ追加および変更できます。

window.history.pushState('page2', 'Title', '/page2.php');

これについて詳しくは、こちらからお読みください


12
file:///Firefox 30などの安全上の理由で機能しない可能性があります。でテストしlocalhostてくださいpython -m SimpleHTTPServer
Ciro Santilli冠状病毒审查六四事件法轮功

6
最初のパラメータは、単なる文字列ではなくオブジェクトであることが期待されています。
Alexis Wilke

40
IMOこれは本当に最良の答えです。現在のURL({}、null、strNewPath)を更新するだけの場合は、実行する必要があります。if(history.pushState){}で最初にテストするのが最善
クレイグジェイコブス

7
変更したくない場合は、最初の2つのパラメーターにnullを入力するだけです。3番目のパラメーターに絶対URLを使用することもできます。
Andrew

3
あなたが答えにちょうどいくつかのより多くの情報を入れればそれは素晴らしいでしょう。パラメータ1が何をするのかわかりません。
RedClover 2017

130

URLを変更したいが、ブラウザの履歴にエントリを追加したくない場合は、HTML5 replaceStateを使用することもできます。

if (window.history.replaceState) {
   //prevents browser from storing history with each change:
   window.history.replaceState(statedata, title, url);
}

これは戻るボタンの機能を「壊す」でしょう。これは、各画像に独自のURLを与えながら、画像ギャラリー(戻るボタンで、表示したすべての画像を移動するのではなく、ギャラリーのインデックスページに戻る必要がある場合など)で必要になる場合があります。


110

これが私の解決策です(newUrlは現在のURLに置き換える新しいURLです):

history.pushState({}, null, newUrl);

1
if(history.pushState){}で最初にテストすることをお勧めします。
クレイグジェイコブス

Firefoxではこれが機能しなくなります。操作は安全ではありません。
kkatusic 2017年

そして、ユーザーはそのアプローチでブックマークを設定することもできます。ユーザー入力時にURLを更新できるようになりました。彼は自分の設定が何であれ、直接ブックマークすることができます。
codepleb

107

注:HTML5ブラウザーを使用している場合は、この回答を無視してください。他の回答でわかるように、これは現在可能です。

ページをリロードせずにブラウザでURLを変更する方法はありません。URLは、最後にロードされたページを表しています。変更すると(document.location)、ページが再読み込みされます。

明らかな理由の1つはwww.mysite.com、銀行のログインページのようなサイトを作成していることです。次に、ブラウザのURLバーをに変更しますwww.mybank.com。ユーザーは、自分が実際に見ていることにまったく気づかないでしょうwww.mysite.com


33
ドメインを変更するのではなく、パスとファイル名のみを変更します。
TheFlash 2009

5
ブラウザは、ドメイン/ mysiteとドメイン/ othersiteの両方がユーザーによって「安全」であると見なされていることをブラウザが認識していないため、これでも潜在的なセキュリティリスクを止めることはできません。たぶん、なぜURLを変更したいのでしょうか。ユーザーから見えないようにする場合は、iframe内でアプリケーションを実行するだけです。
Robin Day、

5
あなたは実際にこれをフラッシュで行うことができます。これにより、リクエストを行わずにURLを変更できます。Flashはブラウザの外部で動作するため、これは可能ですが、Flashは非常に緊密に動作します。
Nick Berardi

142
クライアント側でアドレスバーのURLを変更したい理由は完全に正当だと言わざるを得ません。たとえば、ページング、並べ替え、およびフィルタリングを備えたデータのテーブルがあり、それらをAjaxに対応させたいが、URLを更新して、ページの現在の状態がブックマーク可能になるようにします。ドメイン名の変更(フィッシングなど)によるセキュリティリスクは理解できますが、ブラウザがトップレベルドメインの右側のURLの一部だけをスクリプトで変更できるようにしないのはなぜですか?
日曜日のアイアンフット

41
この答えは100%真実ではありません。詳細については、私の回答を参照してください。
デビッドマードック

83
parent.location.hash = "hello";

15
ハッシュだけではなく、URLを変更したい-#mydata
TheFlash

42
ハッシュの変更は、Cookieを使用しない一種の状態であり、ブックマーク可能であり、ブラウザーの戻るボタンと互換性があるため、ajaxでは便利です。Gmailは最近、これを使用して、よりブラウザフレンドリーにしました。
マシューロック

@ジャービス:違いは何ですか?
2013

@noisyサーバー側の追跡では、追跡サービスに明示的に送信しない限り、ハッシュを確認できません。
RedYetiCo 2014年

これは、バックボーンなど、ハッシュでルーティングするmvcフレームワークを使用している場合には役に立ちません。
catbadger 2017

27

最近のブラウザとHTML5ではpushStateウィンドウで呼び出されるメソッドがありますhistory。これにより、URLが変更され、ページをロードせずに履歴にプッシュされます。

次のように使用できます。1)状態オブジェクト2)タイトルとURL)の3つのパラメーターを取ります。

window.history.pushState({page: "another"}, "another page", "example.html");

これによりURLが変更されますが、ページは再読み込みされません。また、ページが存在するかどうかはチェックされないため、URLに反応するJavaScriptコードを実行すると、次のように操作できます。

history.replaceState()新しい履歴を作成する代わりに現在の履歴を変更することを除いて、まったく同じことを行うものもあります!

また、history.pushState存在するかどうかを確認する関数を作成し、次のように残りを続行できます。

function goTo(page, title, url) {
  if ("undefined" !== typeof history.pushState) {
    history.pushState({page: page}, title, url);
  } else {
    window.location.assign(url);
  }
}

goTo("another page", "example", 'example.html');

また、を変更し#<HTML5 browsers、ページをリロードしないようにすることもできます。これがAngularが使用する方法ですがハッシュタグに従ってSPAです...

変更#は非常に簡単です。

window.location.hash = "example";

そして、あなたはこのようにそれを検出することができます:

window.onhashchange = function () {
  console.log("#changed", window.location.hash);
}

window.onhashchangewindow.onpopstate、このケースで同じことを行いますか?
J0ANMM 2018

ページのコンテンツもロードする方法は?それは単にURLを置き換えます
MD。Atiqur Ra​​hman 2018

ajaxで通常行うようにコンテンツをロードします。
AndroidDev 2018

26

Vivartとgeo1701ですでに述べたように、HTML5 replaceStateが答えです。ただし、すべてのブラウザ/バージョンでサポートされているわけではありません。 History.jsは HTML5の状態機能をラップし、HTML4ブラウザーの追加サポートを提供します。


24

HTML5より前は、次のものが使用できます。

parent.location.hash = "hello";

そして:

window.location.replace("http:www.example.com");

このメソッドはページをリロードしますが、HTML5はページをリロードしhistory.pushState(page, caption, replace_url)てはならないものを導入しました。


2
問題history.pushState(..)は、別のドメインにリダイレクトする場合、クロスドメインポリシーが有効になることです。window.location.replace(..)別のドメインにリダイレクトしながら可能です。
OSWorX 2018年

23

あなたがやろうとしていることがユーザーにページのブックマーク/共有を許可することであり、それが正確なURLである必要はなく、他のものにハッシュアンカーを使用していない場合は、これを2つに分けて行うことができます。部品; 上記で説明したlocation.hashを使用して、ホームページにチェックを実装し、ハッシュアンカーが含まれるURLを探して、次の結果にリダイレクトします。

例えば:

1)ユーザーはオンです www.site.com/section/page/4

2)ユーザーがURLをwww.site.com/#/section/page/6(ハッシュを使用して)に変更するアクションを実行します。ページ6の正しいコンテンツをページにロードしたとしましょう。ハッシュを除いて、ユーザーはあまり邪魔されません。

3)ユーザーがこのURLを他のユーザーに渡すか、ブックマークする

4)他の誰か、または後日同じユーザーが www.site.com/#/section/page/6

5)のコードは、次のようなものを使用してwww.site.com/、ユーザーをにリダイレクトしますwww.site.com/section/page/6

if (window.location.hash.length > 0){ 
   window.location = window.location.hash.substring(1);
}

それが理にかなっていると思います!これは、状況によっては便利な方法です。


17

以下は、ページをリロードせずにURLを変更する関数です。HTML5でのみサポートされます。

  function ChangeUrl(page, url) {
        if (typeof (history.pushState) != "undefined") {
            var obj = {Page: page, Url: url};
            history.pushState(obj, obj.Page, obj.Url);
        } else {
            window.location.href = "homePage";
            // alert("Browser does not support HTML5.");
        }
    }

  ChangeUrl('Page1', 'homePage');

2
@Green、pageは、移動先の州の短いタイトルです。Firefoxは現在このパラメータを無視していますが、将来使用する可能性があります。ここに空の文字列を渡すと、メソッドが将来変更されても安全です。From:developer.mozilla.org/en-US/docs/Web/API/...
スヌーク

13

ロケーションの変更(window.locationまたはdocument.location)は、URLフラグメントを変更するだけではない場合、その新しいURLでリクエストを発生させます。URLを変更すると、URLも変更されます。

現在使用しているURLが気に入らない場合は、Apacheのmod_rewriteなどのサーバー側のURL書き換え技術を使用してください。


「location.pathname」を使用できますか?
TheFlash 2009

3
いいえ、その属性を変更するとリクエストも発生します。
ガンボ

11

アンカータグを追加できます。私は自分のサイトでこれを使用して、Google Analyticsを使用して、ユーザーがページでアクセスしているものを追跡できるようにしています。

アンカータグを追加してから、追跡するページの部分を追加します。

var trackCode = "/#" + urlencode($("myDiv").text());
window.location.href = "http://www.piano-chords.net" + trackCode;
pageTracker._trackPageview(trackCode);

9

Thomas Stjernegaard Jeppesenが指摘したように、History.jsを使用できますをて、ユーザーがAjaxリンクとアプリをナビゲートしている間にURLパラメーターを変更ます。

その回答からほぼ1年が経過し、History.jsは成長し、より安定したクロスブラウザーになりました。現在は、HTML5準拠のブラウザだけでなく、多くのHTML4専用ブラウザでも履歴状態を管理するために使用できます。このデモでは、それがどのように機能するか(およびその機能と制限を試すことができる例)を見ることができます。

このライブラリの使用方法と実装方法についてヘルプが必要な場合は、デモページのソースコードを確認することをお勧めします。非常に簡単に実行できることがわかります。

最後に、ハッシュ(およびハッシュバング)の使用に関する問題の包括的な説明については、Benjamin Luptonによるこのリンクを確認してください



7

この美しくシンプルな関数を使用して、アプリケーションのどこにでもそうすることができます。

function changeurl(url, title) {
    var new_url = '/' + url;
    window.history.pushState('data', 'Title', new_url);
    document.title = title;
}

URLを編集できるだけでなく、タイトルも更新できます。

かなり役に立ちました。


1
アンカーでも魅力のように機能するwindow.history.pushState('data', 'Title', '#new_location');
BIOHAZARD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.