jQueryプロジェクトでURLを取得・操作するには、jQueryのメソッドよりもネイティブJavaScriptの window.location オブジェクトや URLSearchParams APIが使いやすく、jQueryなしでも動作します。この記事では現在のURLの取得から、クエリパラメーターの解析・ハッシュの監視・履歴操作まで体系的に解説します。
- window.locationの全プロパティ(href・pathname・hostname・search・hashなど)
- URLクエリパラメーターを取得・解析する(URLSearchParams)
- URLのハッシュ(#以降)を取得・監視する
- リンク要素のhref属性を取得する
- URLを変更する(pushState・replaceState)
- $(location).attr(“href”)はなぜアンチパターンなのか
window.locationオブジェクトの全プロパティ
現在のページのURLに関する情報はすべて window.location から取得できます。jQueryは不要です。
例として https://codingls.com/jquery/1163/?tab=js&page=2#faq の場合:
| プロパティ | 取得できる値 | 例 |
|---|---|---|
location.href |
URLの完全な文字列 | https://codingls.com/jquery/1163/?tab=js#faq |
location.protocol |
プロトコル(:を含む) | https: |
location.hostname |
ホスト名(ポートなし) | codingls.com |
location.host |
ホスト名+ポート番号 | codingls.com |
location.origin |
プロトコル+ホスト名 | https://codingls.com |
location.pathname |
パス部分(/から始まる) | /jquery/1163/ |
location.search |
クエリ文字列(?を含む) | ?tab=js&page=2 |
location.hash |
ハッシュ(#を含む) | #faq |
// 現在のURLを取得する基本
var fullURL = window.location.href; // URL全体
var path = window.location.pathname; // パスのみ(/jquery/1163/)
var origin = window.location.origin; // オリジン(https://codingls.com)
var queryStr = window.location.search; // クエリ文字列(?tab=js&page=2)
var hash = window.location.hash; // ハッシュ(#faq)
console.log('URL:', fullURL);
console.log('パス:', path);
console.log('クエリ:', queryStr);
$(location).attr("href") は動作しますが、location はDOMオブジェクトではないため本来jQueryで扱うべき対象ではありません。window.location.href を使うのが正しい方法です。余分なjQueryの依存とオーバーヘッドを避けることができます。URLクエリパラメーターを取得・解析する(URLSearchParams)
location.search は ?tab=js&page=2 のような文字列全体を返します。個々のパラメーター値を取得するには URLSearchParams APIが便利です。
URLSearchParamsで特定のパラメーターを取得
// 現在のURL: https://example.com/?tab=js&page=2&keyword=jquery
var params = new URLSearchParams(window.location.search);
// 特定のパラメーターを取得
var tab = params.get('tab'); // 'js'
var page = params.get('page'); // '2'(常に文字列)
var missing = params.get('none'); // null(存在しないキー)
// パラメーターが存在するか確認
if (params.has('tab')) {
console.log('tabパラメーター:', tab);
}
// 数値として使う場合はNumber()で変換
var pageNum = Number(params.get('page')); // 2(数値)
全パラメーターを一覧表示する
var params = new URLSearchParams(window.location.search);
// forEachで全パラメーターを処理
params.forEach(function (value, key) {
console.log(key + ':', value);
});
// オブジェクトに変換する
var paramObj = {};
params.forEach(function (value, key) {
paramObj[key] = value;
});
console.log(paramObj); // { tab: 'js', page: '2', keyword: 'jquery' }
任意のURL文字列からパラメーターを解析する
// 任意のURL文字列を解析する
var url = new URL('https://example.com/search?q=jquery&lang=ja');
var params = url.searchParams;
console.log(params.get('q')); // 'jquery'
console.log(params.get('lang')); // 'ja'
console.log(url.pathname); // '/search'
URLSearchParamsはIE11では未サポートです。IE11対応が必要な場合は、
location.search.replace("?", "").split("&") で文字列を分割してsplit("=") でキーと値を取得する方法を使ってください。URLに特定のパラメーターが含まれているか判定する方法はURLに特定の文字列が含まれているか判定するも参照してください。URLのハッシュ(#以降)を取得・監視する
ページ内アンカーリンクやSPAのルーティングで使われるハッシュの取得と、ハッシュが変化したときのイベント処理です。
// 現在のハッシュを取得(#を含む)
var hash = window.location.hash; // '#faq'
// #を除いた値を取得
var hashValue = window.location.hash.replace('#', ''); // 'faq'
// jQueryでハッシュ変化イベントを監視
$(window).on('hashchange', function () {
var currentHash = window.location.hash;
console.log('ハッシュが変わりました:', currentHash);
// ハッシュに応じてタブやセクションを切り替える
if (currentHash === '#tab-js') {
showTab('js');
} else if (currentHash === '#tab-css') {
showTab('css');
}
});
リンク要素のhref属性からURLを取得する
ページ内の <a> タグのURLを取得するには attr("href") を使います。取得値が相対URLか絶対URLかに注意が必要です。
<a id="link1" href="/jquery/692/">アニメーション完全ガイド</a> <a id="link2" href="https://example.com/page">外部リンク</a> <a id="link3" href="#section1">ページ内リンク</a>
// attr('href'): HTMLに書かれたhref属性の値をそのまま取得
var href1 = $('#link1').attr('href'); // '/jquery/692/'(相対URL)
var href2 = $('#link2').attr('href'); // 'https://example.com/page'(絶対URL)
var href3 = $('#link3').attr('href'); // '#section1'(ページ内リンク)
// prop('href'): ブラウザが解決した絶対URLを取得
var absHref1 = $('#link1').prop('href');
// 'https://codingls.com/jquery/692/'(絶対URLに変換される)
// クリック時にhrefを取得してカスタム処理
$(document).on('click', 'a.tracked-link', function (e) {
e.preventDefault();
var url = $(this).attr('href');
console.log('クリックされたURL:', url);
// アナリティクス送信など
window.location.href = url; // 手動でページ遷移
});
attr("href"): HTMLに書かれた値そのまま(相対URLは相対URLのまま)。リンク先の確認やカスタム属性として使う場合に向いています。prop("href"): ブラウザが解決した絶対URLを返します。URLの比較や外部リンク判定など絶対URLが必要な処理に向いています。URLを変更する(pushState・replaceState)
SPAやフィルター機能でURLを変更してページ遷移なしに履歴を操作するにはhistory.pushState() / history.replaceState() を使います。
| メソッド | ブラウザ履歴 | 用途 |
|---|---|---|
history.pushState() |
履歴に追加(「戻る」ボタンで前のURLに戻れる) | ページ遷移を伴わない状態変化 |
history.replaceState() |
現在の履歴を置き換え(「戻る」ボタンで前には戻れない) | 検索フィルターのURL更新など |
window.location.href = url |
履歴に追加(ページ読み込みが発生) | 通常のページ遷移 |
// pushState: URLを変更して履歴に追加(ページは再読み込みしない)
history.pushState({ page: 2 }, '', '?page=2');
// 現在のURLが https://example.com/?page=2 になる
// replaceState: 現在の履歴エントリを置き換える
history.replaceState({ tab: 'js' }, '', '?tab=js');
// popstate: 「戻る/進む」ボタンでURLが変化したときに発火
$(window).on('popstate', function (e) {
var state = e.originalEvent.state;
console.log('履歴移動:', state);
// 状態に応じてページ内容を切り替える
});
// クエリパラメーターをURLSearchParamsで組み立ててから変更
var params = new URLSearchParams(window.location.search);
params.set('tab', 'css');
params.set('page', '1');
history.pushState({}, '', '?' + params.toString());
pushState/replaceStateはURLを変更するだけで、サーバーへのリクエストは発生しません。ページ内容の更新はJavaScript側で行う必要があります。jQueryのAjaxと組み合わせたGETリクエストの詳細はGETリクエストを送信するを参照してください。
まとめ
URLの取得・操作はjQueryのメソッドよりもネイティブJavaScriptの window.location と URLSearchParams が高機能で使いやすいです。
- 現在のURL全体:
window.location.href - クエリパラメーター:
new URLSearchParams(location.search).get("key") - ハッシュ変化の監視:
$(window).on("hashchange", fn) - リンクのURL取得:
$(el).attr("href")(相対)/$(el).prop("href")(絶対) - ページ遷移なしのURL変更:
history.pushState()
関連記事: URLに特定の文字列が含まれているか判定する / GETリクエストを送信する / POSTリクエストを送信する
よくある質問(FAQ)
location.href は https://example.com/page/?q=1#top のようなURL全体です。location.pathname は /page/ のようなドメイン以降のパス部分のみです。「現在どのページにいるか」を判定したい場合は pathname を使うとプロトコルやドメインの違いを無視して比較できます。var params = {}; location.search.replace(/[?&]([^=&]+)=([^&]*)/g, function(m, k, v) { params[k] = decodeURIComponent(v); });または URLSearchParams のポリフィルを導入してください。index.html にリダイレクトする設定が必要です。WordPressの場合はRewriteRuleの設定が必要になります。prop("href") を使うと自動的に絶対URLが返されます。または new URL(attr("href"), window.location.origin) で変換できます:new URL("/jquery/692/", window.location.origin).href → "https://codingls.com/jquery/692/"$("#my-iframe")[0].contentWindow.location.href で取得できます。異なるオリジン(クロスオリジン)の場合はセキュリティ制限により取得できません。代わりにiframe側からpostMessageでURLを送信する方法を使ってください。