ページを更新せずにJavaScriptでwindow.location(URL)からハッシュを削除する方法は?


332

次のようなURLがあります。http://example.com#something削除するにはどうすればよいですか。#something。ページを更新せずにはですか。

私は次の解決策を試みました:

window.location.hash = '';

ただし、これ#によってURLからハッシュ記号が削除されるわけではありません。


3
本当にこれを実行しますか?ページが更新されます。
セス

9
ページを更新せずに行うことはできますか?
トムリーマン

1
それはある可能。AJAX履歴ライブラリがそれを扱います。しかし、それは簡単ではなく、ほとんどすべてのブラウザーで異なる方法で行う必要があります。あなたが入りたいものではありません。
Gabriel Hurley

視覚的なもの以外に「#」を残すことについての考慮事項はありますか?
user29660

回答:


210

最初の質問:

window.location.href.substr(0, window.location.href.indexOf('#'))

または

window.location.href.split('#')[0]

どちらもハッシュなしのURLまたはその後のURLを返します。

あなたの編集に関して:

に変更を加えるとwindow.location、ページが更新されます。window.location.hash更新をトリガーせずに変更できます(ただし、ハッシュがページ上のIDと一致する場合はウィンドウがジャンプします)が、ハッシュ記号を取り除くことはできません。どちらが悪いかを選んでください...

最も最新の回答

犠牲を払わずにそれを行う方法(完全なリロードまたはハッシュ記号をそこに残すこと)に関する正しい答えは、ここにあります。2009年の元の回答に関してはこの回答をそのままにしておきますが、新しいブラウザAPIを利用する正しい回答は1.5年後に与えられました。


22
これは単なる間違いです。window.location.hashを変更しても、更新はトリガーされません。
Evgeny、

61
@Evgeny-それが私の答えです。window.location.hashを変更しても更新はトリガーされないことを明確に述べます。「更新をトリガーせずにwindow.location.hashを変更できます(ただし、ハッシュがページ上のIDと一致するとウィンドウはジャンプします)」。
Gabriel Hurley

3
ページのリロードなし-それは問題です。ページのリロードが必要/強制されるため、これは答えではありません!
Ed_

10
また、それが✓の答えであってはならない
アベニエ

4
これはOPの質問に対する回答ではありません。
ブライス

586

この問題を解決することは、今日でははるかに手の届く範囲です。HTML5の歴史APIは、私たちは、現在のドメイン内の任意のURLを表示するには、ロケーションバーを操作することができます。

function removeHash () { 
    history.pushState("", document.title, window.location.pathname
                                                       + window.location.search);
}

作業デモ:http : //jsfiddle.net/AndyE/ycmPt/show/

これは、Chrome 9、Firefox 4、Safari 5、Opera 11.50 、および IE 10で機能します。サポートされていないブラウザーの場合は、利用可能な場合はいつでもそれを使用する正常に機能を低下させるスクリプトを記述できます。

function removeHash () { 
    var scrollV, scrollH, loc = window.location;
    if ("pushState" in history)
        history.pushState("", document.title, loc.pathname + loc.search);
    else {
        // Prevent scrolling by storing the page's current scroll offset
        scrollV = document.body.scrollTop;
        scrollH = document.body.scrollLeft;

        loc.hash = "";

        // Restore the scroll offset, should be flicker free
        document.body.scrollTop = scrollV;
        document.body.scrollLeft = scrollH;
    }
}

そのため、ハッシュシンボルを取り除くことができますが、すべてのブラウザーではまだです。

注:ブラウザの履歴で現在のページを置き換える場合は、のreplaceState()代わりにを使用してくださいpushState()


9
次の行を使用して、クエリ文字列を失わないようにしてください。history.pushState( ""、document.title、window.location.pathname + window.location.search);
Phil Kulak

6
@Phil:指摘してくれてありがとう、それに応じて答えを更新しました。私はきれいなURLを使うのにも慣れています。
Andy E

1
古いバージョンのIEでは、document.bodyではなくdocument.documentElementを使用する必要があるようです。この回答を見るstackoverflow.com/a/2717272/359048
jasonmcclurg 2013

29
ブラウザの履歴に余分なエントリを作成しないように、pushStateの代わりにreplaceStateを使用することをお勧めします。
ニコ

1
@santiagoarizti:そうです、私は同じ結論に達しました。私が(7年前に)書いたコードを適切に検査しなかったため、ハッシュを削除するときにボタンの状態も切り替えていたことがわかりませんでした。ハッシュを手動で変更しているので、いつでも自分でイベントをトリガーできます。
アンディE

85

(回答が多すぎて冗長で時代遅れです。)現在の最善の解決策は次のとおりです。

history.replaceState(null, null, ' ');

5
history.pushState(null, null, ' ')履歴を保存したい場合は、代わりに使用してください。
nichijou

9
and パラメータの受け渡しnullが最終的に何を行うかを説明すると役立つ場合がstateありtitleます。
V.ルビネッティ

この問題と残りの問題は、以前はなかったときにハッシュが空になったとしても、onhashchangeをトリガーしないことです。
Curtis

1
TypeScriptでは、コマンドが文字列を受け取るため、2番目のパラメーターにnullは許可されません。Mozillaは空の文字列を推奨しています。
Curtis

41

シンプルでエレガント:

history.replaceState({}, document.title, ".");  // replace / with . to keep url

3
同じディレクトリにとどまりたい場合は、スラッシュの代わりにドットを使用してください
vahanpwns

1
.代わりに使用するには、@ vahanpwnsノートに関して回答を更新してください/。を使用/すると、URLがルートパスに変更されます。
アイザックグレッグソン2015年

5
この回答をありがとう、私history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));は自分のユースケースに合わせて修正しました。
Scott Jungwirth、2015年

5
これはURLクエリを保持しません。
Vladislav Kostenko 2017年

2
私のユースケースは、プッシュするのではなく、交換することもありましたが、これは私に多くの意味があります:history.replaceState(null, document.title, location.pathname + location.search);
MDMower

16

ハッシュを削除するには、この関数を使用してみてください

function remove_hash_from_url()
{
    var uri = window.location.toString();
    if (uri.indexOf("#") > 0) {
        var clean_uri = uri.substring(0, uri.indexOf("#"));
        window.history.replaceState({}, document.title, clean_uri);
    }
}

13

これにより、末尾のハッシュも削除されます。例:http : //test.com/123#abc- > http://test.com/123

if(window.history.pushState) {
    window.history.pushState('', '/', window.location.pathname)
} else {
    window.location.hash = '';
}

これにより、URLに存在するクエリ
パラメータが

1
@kevgathukuあなたはlocation.searchでそれらを追加することができます、例えば: `window.history.pushState( ''、 '/'、window.location.pathname + window.location.search)`
Chris Gunawardena

6

次はどうですか?

window.location.hash=' '

ハッシュを空の文字列ではなく単一のスペースに設定していることに注意してください。


ハッシュを無効なアンカーに設定しても、更新は行われません。といった、

window.location.hash='invalidtag'

しかし、上記の解決策は誤解を招くものであると思います。これは、指定された名前に指定された位置にアンカーがないことを示しているようです。同時に、空の文字列を使用すると、ページが上部に移動するため、許容できない場合があります。また、スペースを使用すると、URLがコピーされ、ブックマークが付けられて再びアクセスされるときは常に、ページが上部になり、スペースは無視されます。

そして、ちょっと、これはStackOverflowに関する私の最初の回答です。誰かがそれが有用であり、コミュニティの基準に一致していると誰かが願っています。


7
ハッシュを空白に設定しても、URLの末尾に#が残りますが、それを完全に削除することが目標だと思います。
mahemoff 2016

1
URLの最後にハッシュが続きます。問題は、それを削除する方法です。
Gurmeet Singh 2017

はい、ハッシュ文字列を使用して#を削除する方法はありますか。
Bhavin Thummar、

6

あなたは以下のようにそれを行うことができます:

history.replaceState({}, document.title, window.location.href.split('#')[0]);


1
スター付きの回答はどちらの場合も機能しませんでしたが、これは機能しました。ありがとう!
開発

5
const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);

2
このコードは質問に答えることがありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
rollstuhlfahrer

3
<script type="text/javascript">
var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
    var clean_uri = uri.substring(0, uri.indexOf("?"));
    window.history.replaceState({}, document.title, clean_uri);
}
</script>

このコードをヘッドセクションに配置します


3
function removeLocationHash(){
    var noHashURL = window.location.href.replace(/#.*$/, '');
    window.history.replaceState('', document.title, noHashURL) 
}

window.addEventListener("load", function(){
    removeLocationHash();
});

2

もっと安全だと思います

if (window.history) {
    window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
    window.location.hash = '';
}

0

以下を試してください:

window.history.back(1);

23
ユーザーがハッシュを含むURLに直接アクセスした場合、これは質問の答えにはなりません。
nickb 2014年

このトリックは、前のページへのリンクを作成したいだけのときに非常に役立ちますが、リンクはjsファイルの束に隠されています。
ValidfroM 2014

まさに私が探していたもの。これは、javasript関数から返された値を使用するために、私のWebアプリで作成されたばかりのハッシュタグを完全に削除するように機能します。
user278859

0

次に、hrefを使用して場所を変更し、スクロールせずにハッシュをクリアする別のソリューションを示します。

魔法の解決策はここで説明されています。仕様はこちら

const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;    
history.pushState('', document.title, window.location.pathname);

注:提案されたAPIは、WhatWG HTML Living Standardの一部になりました



-1

ハッシュをnullに置き換えることができます

var urlWithoutHash = document.location.href.replace(location.hash , "" );

1
「ページを更新せずに」という質問ですが、この方法ではページが更新されます。回答の中でこの事実に注意する必要があります。そのため、ここで実際に回答を得ようとしているのとは異なる質問に回答していることを直接確認するのに時間を浪費する必要はありません。
Vladimir Kornea

ページは更新されません。
シプリアン2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.