【JavaScript】URLのパラメータを引き継ぐ方法

検索クエリや絞り込み条件などを、別ページに移動しても保持したい——つまりURLのパラメータを引き継ぎたい場面はよくあります。

全部そのまま引き継ぐだけなら location.search を付けるだけですが、遷移先のURLに既にクエリがある場合は工夫が必要です(単純に ? を付け足すと ? が二重になって壊れます)。この記事では安全な引き継ぎ方を解説します。

この記事の結論:現在のパラメータを全部引き継ぐだけなら 遷移先URL + location.search。遷移先に既存クエリがある場合は new URL() でマージします(url + "?" + params? が二重になるので避ける)。一部だけ・書き換えも URLSearchParams で柔軟にできます。
スポンサーリンク

全パラメータをそのまま引き継ぐ(location.search)

現在のパラメータをそっくりそのまま引き継ぐなら、遷移先URLに location.search? を含むクエリ文字列)を足すだけです。オブジェクトに変換する必要はありません。

JavaScript: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 は "" なので、余計な ? は付かない
注意:これは遷移先にクエリが無い場合だけ:遷移先URLが既に ?lang=ja のようなクエリを持っていると、...new-page?lang=ja?page=2? が二重になって壊れます。その場合は次の new URL() でマージしてください。

遷移先にクエリがある場合:new URLでマージ

どんな遷移先でも安全なのは、new URL() でURLを組み立て、searchParams に現在のパラメータをマージする方法です。遷移先の既存クエリを保ちつつ、現在のパラメータを追加できます。

JavaScript:new URLで安全にマージ
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を遷移させる方法も参考になります。

一部のパラメータだけ引き継ぐ

全部ではなく、特定のパラメータだけ引き継ぎたい場合は、必要なキーだけをコピーします。

JavaScript:指定キーだけ引き継ぐ
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 を組み立て直します。

JavaScript:リンクにパラメータを付与
// 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 を使うと安全です。

JavaScript:書き換えて引き継ぐ
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)

QURLのパラメータを別ページに引き継ぐ最も簡単な方法は?
A遷移先URLに location.search を足すだけです。例:location.href = "/new" + location.search。ただし遷移先に既存クエリがあると ? が二重になるため、その場合は new URL() でマージします。
Q遷移先URLに既にクエリがある場合はどうすればいい?
Anew URL(遷移先) を作り、target.searchParams.set(key, value) で現在のパラメータをマージします。これなら遷移先の既存クエリを保ちつつ安全に追加でき、? の二重も起きません。
Q特定パラメータのみ残して他を全削除するには?
A保持したいキーだけで新しい URLSearchParams を組み立てるか、URLSearchParams をイテレートして不要なキーを delete() します。
QURLをパースして各部分を取り出すには?
Anew URL(location.href) でURLオブジェクトを作成し、.origin.pathname.search.hash などで各部分を取得できます。

まとめ

URLパラメータの引き継ぎは、全部そのままなら 遷移先 + location.search遷移先にクエリがあるなら new URL() でマージするのが基本です。

url + "?" + params.toString() は遷移先にクエリがあると ? が二重になって壊れるため、new URL()url.search を使う方が安全です。一部だけ引き継ぐ・書き換える・リンクに付与する、といった応用も URLSearchParams で柔軟に行えます。