https://example.com/#aaa という URL でサイトにアクセスした場合に、後ろの #aaa の部分を取得するには、 location.hash を参照します。
この値には、先頭の # が含まれるため、# を除いた文字列を取得したい場合は substring を合わせて使用します。
const a = location.hash; // '#aaa'
const b = location.hash.substring(1); // 'aaa'
逆に、ハッシュフラグメントの部分を #bbb に変更するには次のようにします。
location.hash = 'bbb'; // 先頭の # は省略可
ブラウザの URL 表示は、https://example.com/#bbb に変化します。
https://example.com/#あ のように、ハッシュフラグメントに日本語が含まれている場合、location.hash.substring(1) で取得される値は、%E3%81%82 といった URI エンコードされた値になってしまいます。
正しく あ という日本語を取得するには、次のように decodeURI を使って URI デコードします。
const hash = decodeURI(location.hash.substring(1));
URL の後ろの #aaa の部分(ハッシュフラグメント)が変化した場合に何か処理をしたい場合は、次のように hashchange イベントをハンドルします。
window.addEventListener('hashchange', () => {
alert('hash = ' + location.hash);
});
$(window).on('hashchange', () => {
alert('hash = ' + location.hash);
});
このタイミングでページ内のコンテンツを差し替えるようにすれば、画面リロードのない シングルページアプリケーション (SPA) などを作成できます。
ハッシュフラグメントを含む URL をブラウザで開いたときに、その値を使って HTML 要素を操作したい場合は、 DOMContentLoaded イベントをハンドルして処理するとよいです。
次の例では、ページを表示したタイミングでハッシュフラグメントの値を div 要素内に表示します。
<div id="msg">メッセージ表示領域</div>
<script>
function handleHashFragment() {
const hash = location.hash.substring(1);
const elem = document.getElementById('msg');
elem.innerText = 'ハッシュフラグメントの値: ' + hash;
}
window.addEventListener('DOMContentLoaded', handleHashFragment);
window.addEventListener('hashchange', handleHashFragment);
</script>
上記では、ついでにページ表示後にハッシュフラグメントが変化した場合 (hashchange) も追従するようにしています。