検索クエリや絞り込み条件などを、別ページに移動しても保持したい——つまりURLのパラメータを引き継ぎたい場面はよくあります。
全部そのまま引き継ぐだけなら location.search を付けるだけですが、遷移先のURLに既にクエリがある場合は工夫が必要です(単純に ? を付け足すと ? が二重になって壊れます)。この記事では安全な引き継ぎ方を解説します。
遷移先URL + location.search。遷移先に既存クエリがある場合は new URL() でマージします(url + "?" + params は ? が二重になるので避ける)。一部だけ・書き換えも URLSearchParams で柔軟にできます。全パラメータをそのまま引き継ぐ(location.search)
現在のパラメータをそっくりそのまま引き継ぐなら、遷移先URLに location.search(? を含むクエリ文字列)を足すだけです。オブジェクトに変換する必要はありません。
// 現在のURLが ...?page=2&sort=desc のとき location.href = "https://example.com/new-page" + location.search; // → https://example.com/new-page?page=2&sort=desc // パラメータが無ければ location.search は "" なので、余計な ? は付かない
?lang=ja のようなクエリを持っていると、...new-page?lang=ja?page=2 と? が二重になって壊れます。その場合は次の new URL() でマージしてください。遷移先にクエリがある場合:new URLでマージ
どんな遷移先でも安全なのは、new URL() でURLを組み立て、searchParams に現在のパラメータをマージする方法です。遷移先の既存クエリを保ちつつ、現在のパラメータを追加できます。
function carryParams(targetUrl) {
const target = new URL(targetUrl, location.origin);
const current = new URLSearchParams(location.search);
// 現在のパラメータを遷移先にマージ(同名は現在の値で上書き)
current.forEach((value, key) => target.searchParams.set(key, value));
return target.href;
}
// 遷移先に既存クエリ(?lang=ja)があっても壊れない
location.href = carryParams("https://example.com/new-page?lang=ja");
// → https://example.com/new-page?lang=ja&page=2&sort=desc
同名パラメータの重複をそのまま残したいときは、set の代わりに append を使います。URLの遷移全般はURLを遷移させる方法も参考になります。
一部のパラメータだけ引き継ぐ
全部ではなく、特定のパラメータだけ引き継ぎたい場合は、必要なキーだけをコピーします。
const current = new URLSearchParams(location.search);
const target = new URL("https://example.com/new-page");
// page と sort だけ引き継ぐ
for (const key of ["page", "sort"]) {
if (current.has(key)) {
target.searchParams.set(key, current.get(key));
}
}
location.href = target.href;
リンク(aタグ)に引き継ぐ
ボタン遷移だけでなく、ページ内のリンクに現在のパラメータを引き継がせることもできます。対象のリンクにクラスを付けておき、href を組み立て直します。
// class="keep-params" のリンクに現在のパラメータを引き継ぐ
document.querySelectorAll("a.keep-params").forEach((a) => {
const url = new URL(a.href);
new URLSearchParams(location.search).forEach((value, key) => {
url.searchParams.set(key, value);
});
a.href = url.href;
});
パラメータを書き換えてから引き継ぐ
引き継ぐ前にパラメータを変更・削除したいときは、URLSearchParams を操作してから渡します。クエリ全体の差し替えには url.search を使うと安全です。
const params = new URLSearchParams(location.search);
params.set("page", "1"); // 値を変更
params.delete("temp"); // 不要なパラメータを削除
const target = new URL("https://example.com/new-page");
target.search = params.toString(); // クエリ全体を差し替え(?は自動)
location.href = target.href;
パラメータの取得・操作の基礎はURLのパラメータを取得する方法、取得した値で処理を分けるならURLパラメータを取得して処理を分岐する方法を参照してください。
よくある質問(FAQ)
location.search を足すだけです。例:location.href = "/new" + location.search。ただし遷移先に既存クエリがあると ? が二重になるため、その場合は new URL() でマージします。new URL(遷移先) を作り、target.searchParams.set(key, value) で現在のパラメータをマージします。これなら遷移先の既存クエリを保ちつつ安全に追加でき、? の二重も起きません。URLSearchParams を組み立てるか、URLSearchParams をイテレートして不要なキーを delete() します。new URL(location.href) でURLオブジェクトを作成し、.origin・.pathname・.search・.hash などで各部分を取得できます。まとめ
URLパラメータの引き継ぎは、全部そのままなら 遷移先 + location.search、遷移先にクエリがあるなら new URL() でマージするのが基本です。
url + "?" + params.toString() は遷移先にクエリがあると ? が二重になって壊れるため、new URL() や url.search を使う方が安全です。一部だけ引き継ぐ・書き換える・リンクに付与する、といった応用も URLSearchParams で柔軟に行えます。
