12k
All articles

JavaScriptでURLパラメータを取得する方法

URLSearchParamsまたはレガシーブラウザ向けカスタム関数でURLパラメータを取得し、エンコード文字や値の欠落を適切に処理する方法を解説。

OpenReplay Team
OpenReplay Team
JavaScriptでURLパラメータを取得する方法

URLパラメータ(クエリ文字列とも呼ばれる)は、Web開発において重要な要素であり、ページ間でのデータ受け渡しやクライアントからサーバーへのデータ送信を可能にします。検索機能の構築、フォーム送信の処理、ユーザー設定の追跡など、これらのパラメータを抽出・活用する方法を知ることは必須です。

この記事では、JavaScriptを使用してURLパラメータを取得する最も効果的な方法を、最新のアプローチから従来のソリューションまで紹介します。

重要なポイント

  • URLSearchParamsは、URLパラメータを処理する現代的で推奨される方法です
  • 単一のパラメータ値を取得するにはurlParams.get('param')を使用します
  • パラメータが存在するかチェックするにはurlParams.has('param')を使用します
  • 古いブラウザでは、カスタムパース関数を実装します
  • 特殊文字を処理するため、常にパラメータ値をデコードします
  • URLパラメータを使用する際のセキュリティ上の注意点を理解しておきます

URLパラメータの理解

URLパラメータは、URL内のクエスチョンマーク(?)の後に現れ、キー・値のペアとして形式化されています:

https://example.com/page?name=john&id=123

この例では、namejohnの値を持ち、id123の値を持つ2つのパラメータがあります。

最新のアプローチ:URLSearchParams

最新のブラウザでURLパラメータを処理する最もシンプルで信頼性の高い方法は、URLSearchParamsインターフェースを使用することです。

基本的な使用方法

// URL例: https://example.com/page?product=shirt&color=blue&size=m

// クエリ文字列を取得
const queryString = window.location.search;

// クエリ文字列をパース
const urlParams = new URLSearchParams(queryString);

// 特定のパラメータ値を取得
const product = urlParams.get('product'); // "shirt"
const color = urlParams.get('color');     // "blue"

パラメータの存在確認

// パラメータが存在するかチェック
if (urlParams.has('product')) {
  // パラメータが存在する
  console.log('productパラメータが存在します');
}

複数値の処理

パラメータがURL内で複数回現れる場合、すべての値を取得できます:

// URL: https://example.com/page?tag=javascript&tag=frontend

// パラメータのすべての値を取得
const tags = urlParams.getAll('tag'); // ["javascript", "frontend"]

パラメータの反復処理

URLSearchParamsは、すべてのパラメータを操作するためのイテレーターメソッドを提供します:

// すべてのパラメータキーを反復処理
for (const key of urlParams.keys()) {
  console.log(key);
}

// すべてのパラメータ値を反復処理
for (const value of urlParams.values()) {
  console.log(value);
}

// すべてのパラメータエントリ(キー・値のペア)を反復処理
for (const [key, value] of urlParams.entries()) {
  console.log(`${key}: ${value}`);
}

従来のアプローチ:カスタム関数

URLSearchParamsをサポートしていない古いブラウザでは、カスタム関数を作成できます:

function getUrlParam(param) {
  const queryString = window.location.search.substring(1);
  const urlParams = queryString.split('&');
  
  for (let i = 0; i < urlParams.length; i++) {
    const paramPair = urlParams[i].split('=');
    if (paramPair[0] === param) {
      return decodeURIComponent(paramPair[1] || "");
    }
  }
  return null;
}

// 使用方法
const productValue = getUrlParam('product');

一般的なエッジケースの処理

エンコードされた文字

URLパラメータには、しばしばエンコードされた文字が含まれます。例えば、スペースは%20としてエンコードされます:

// URL: https://example.com/search?query=web%20development

const query = urlParams.get('query');
console.log(query); // "web development" (自動的にデコードされる)

カスタム関数を使用する場合は、これらのエンコードされた文字を正しく処理するためにdecodeURIComponent()を使用することを確認してください。

存在しないパラメータ

パラメータを使用する前に、常に存在するかチェックしてください:

const size = urlParams.has('size') ? urlParams.get('size') : 'default';

空のパラメータ

パラメータは値なしで存在する場合があります:

// URL: https://example.com/page?newsletter=&theme=dark

const newsletter = urlParams.get('newsletter'); // "" (空文字列)
const hasNewsletter = urlParams.has('newsletter'); // true

完全な例:すべてのURLパラメータを取得

すべてのURLパラメータをオブジェクトとして取得する包括的な関数は以下の通りです:

function getAllUrlParams() {
  const params = {};
  const queryString = window.location.search.substring(1);
  
  if (queryString) {
    const pairs = queryString.split('&');
    
    for (const pair of pairs) {
      const [key, value] = pair.split('=');
      
      // パラメータに値がない場合、trueに設定
      if (typeof value === 'undefined') {
        params[key] = true;
      } else {
        // すでにこのパラメータがある場合、配列に変換
        if (params[key]) {
          if (!Array.isArray(params[key])) {
            params[key] = [params[key]];
          }
          params[key].push(decodeURIComponent(value));
        } else {
          params[key] = decodeURIComponent(value);
        }
      }
    }
  }
  
  return params;
}

ブラウザ互換性

URLSearchParamsは、以下を含むすべての最新ブラウザでサポートされています:

  • Chrome 49+
  • Firefox 44+
  • Safari 10.1+
  • Edge 17+

Internet Explorerなどの古いブラウザでは、ポリフィルまたはカスタム関数アプローチを使用する必要があります。

パフォーマンスの考慮事項

ほとんどのアプリケーションでは、メソッド間のパフォーマンスの違いは無視できます。ただし:

  1. URLSearchParamsは最適化されており、ブラウザベンダーによって維持されています
  2. カスタム関数は特定のニーズに合わせて調整できます
  3. 単一のパラメータのみを取得する場合、シンプルな正規表現の方が高速な場合があります

セキュリティに関する注意

URLパラメータはブラウザのアドレスバーに表示され、機密情報には安全ではないことを覚えておいてください。アプリケーションで使用する前に、常にパラメータ値を検証・サニタイズしてください。

まとめ

URLSearchParamsインターフェースは、JavaScriptでURLパラメータを操作するためのクリーンで標準化された方法を提供します。ほとんどの最新のWebアプリケーションでは、これが推奨されるアプローチです。レガシーブラウザサポートが必要な場合は、カスタム関数を使用して、少し多くのコードで同じ機能を提供できます。

URLパラメータを効果的に抽出・活用する方法を理解することで、より動的でインタラクティブなWebアプリケーションを構築できます。

よくある質問

JavaScriptでURLパラメータを変更できますか?

はい、URLSearchParamsを使用してパラメータを変更し、history.pushState()またはhistory.replaceState()でURLを更新できます。

シングルページアプリケーションでURLパラメータを処理するにはどうすればよいですか?

ほとんどのSPAフレームワーク(React、Vue、Angular)には、URLパラメータを処理する組み込みのルーティングシステムがあります。詳細については、フレームワークのドキュメントを確認してください。

URLパラメータは大文字小文字を区別しますか?

URL仕様によると、パラメータ名は大文字小文字を区別するため、'name'と'Name'は異なるパラメータです。

URLパラメータで配列を処理するにはどうすればよいですか?

同じパラメータ名を複数回使用する(例:?color=red&color=blue)か、ブラケット記法を使用する(例:?colors[]=red&colors[]=blue)ことができます。

URLパラメータの最大長はどのくらいですか?

公式な制限はありませんが、ブラウザとサーバーは通常、URL全体で約2,000〜8,000文字の実用的な制限があります。

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers

We use cookies to improve your experience. By using our site, you accept cookies.