jQuery / JavaScript(クエリ文字列)でクエリ文字列パラメーターのURL値を取得する


149

クエリ文字列パラメーターを処理するためのjQuery拡張機能を作成する良い方法を知っている人はいますか?基本的に、jQueryマジック($)関数を拡張して、次のようなことができるようにします。

$('?search').val(); 

これにより、次のURLで「test」という値が得られますhttp://www.example.com/index.php?search=test

jQueryとJavascriptでこれを実行できる多くの関数を見てきましたが、実際には、jQueryを拡張して、上に示したとおりに機能するようにしたいと考えています。私はjQueryプラグインを探しているのではなく、jQueryメソッドの拡張機能を探しています。



1
@NicoWesterdale-私はそのリンクを通過しましたが、この特定の質問を解決する答えは見つかりませんでした。彼はまさに上と同じように望んでいると言った。
mrtsherman 2011年

2
私はあなたがこれを行うことができるとは思いません、渡された文字列はsizzlerによって解析され、DOMオブジェクトの配列に解決されます。マッチャーを拡張してカスタムフィルターを提供できますが、文字列に基づいたjqueryオブジェクトを持つことはできません。
Andrew

6
$十分な過負荷ではありませんか?
Quentin、

1
@mrtsherman私が提供したリンクのgetParameterByName()関数を見てください。$プロンプト内から直接実行することはできませんが、jQueryセレクターの目的ではありません。$()が行うDOMの一部にアクセスしようとするのではなく、URL文字列の一部を選択しているだけです。それはまったく別のものです。本当にjQueryを使用したい場合は、次の構文を使用するプラグインを作成できます:$ .getParameterByName(param)、リンク先のページのさらに下に、まさにそれを実行する例があります。ちょっと無意味です。
Nico Westerdale、2011年

回答:


46

長年の醜い文字列解析の後、より良い方法があります:URLSearchParamsこの新しいAPIを使用して場所から値を取得する方法を見てみましょう!

//「?post = 1234&action = edit」を想定

var urlParams = new URLSearchParams(window.location.search);
console.log(urlParams.has('post')); // true
console.log(urlParams.get('action')); // "edit"
console.log(urlParams.getAll('action')); // ["edit"]
console.log(urlParams.toString()); // "?post=1234&action=edit"
console.log(urlParams.append('active', '1')); // "?

post=1234&action=edit&active=1"

更新:IEはサポートされていません

URLSearchParamsの代わりに以下の回答からこの関数を使用してください

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('action')); //edit

1
URLSearchParamsはすべてのブラウザでサポートされていますか?
神聖な

おっとっと!ああ、IEはサポートされていません!! 私はちょうどそれでテストしました。Chrome、FF、Safariには問題はありません。
Saurin

1
@divine-ここにURLSearchParamsのポリフィルがあります:github.com/WebReflection/url-search-params
Roberto

サポートされていないブラウザにポリフィルを追加すると、このURLSearchParamsソリューションがうまく機能します。github.com/ungap/url-search-params
Louisvdw

104

jQueryを拡張する理由 jQueryを拡張することと、グローバル関数を使用することの利点は何でしょうか?

function qs(key) {
    key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); // escape RegEx meta chars
    var match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)"));
    return match && decodeURIComponent(match[1].replace(/\+/g, " "));
}

http://jsfiddle.net/gilly3/sgxcL/

別のアプローチは、クエリ文字列全体を解析し、後で使用するためにオブジェクトに値を格納することです。このアプローチは、正規表現を必要とせず、window.locationオブジェクトを拡張します(ただし、グローバル変数を簡単に使用できます)。

location.queryString = {};
location.search.substr(1).split("&").forEach(function (pair) {
    if (pair === "") return;
    var parts = pair.split("=");
    location.queryString[parts[0]] = parts[1] &&
        decodeURIComponent(parts[1].replace(/\+/g, " "));
});

http://jsfiddle.net/gilly3/YnCeu/

このバージョンArray.forEach()では、IE7とIE8でネイティブに使用できないも使用します。MDNの実装を使用し追加するか、$.each()代わりにjQueryを使用できます。


2
一般的ではありませんが、クエリパラメータでアンパサンドの代わりにセミコロンを使用することは有効です。
Muhd、

@Muhd-コードが理解できる限り、クエリ文字列で任意の区切り文字を使用することは「有効」です。ただし、フォームが送信されると、フォームフィールドはname=valueで区切られたペアとして送信され&ます。コードでカスタムクエリ文字列形式を使用している場合は、サーバーでもクライアントでも、クエリ文字列が使用される場所にカスタムクエリ文字列パーサーを作成する必要があります。
gilly3

2
@nick-興味深い。しかし、セミコロンをアンパサンドとして扱うというHTTPサーバーの提案は、フォーム送信を模倣するリンクを使用する場合にHTMLをより美しくするためにのみ役立ちます。これは単なる提案であり、標準ではありません。標準のフォームGET送信はとしてエンコードされapplication/x-www-form-urlencoded、値はで区切られ&ます。私のコードはその標準を処理します。リンクしたようなカスタムURL構造には、サーバー側とクライアント側のカスタムパーサーが必要です。とにかく、上記のコードにそのような機能を追加するのは簡単です。
gilly3

1
@gilly確かに-ポータブルコードが必要な場合は、両方をサポートする必要があります
ニック

1
RegExp()に "i"を追加すると、キーで大文字と小文字が区別されなくなります。new RegExp( "[?&]" + key + "=([^&] +)(&| $)"、 "i"));
Yovav 2017

94

jQuery jQuery-URL-Parserプラグインは同じ仕事をします。たとえば、検索クエリ文字列paramの値を取得するには、次のように使用できます

$.url().param('search');

このライブラリは積極的にメンテナンスされていません。同じプラグインの作成者が提案したように、URI.jsを使用できます。

または、代わりにjs-urlを使用できます。以下のものと非常に似ています。

したがって、次のようにクエリパラメータにアクセスできます $.url('?search')


2
いいね。また、コードはパブリックドメインにあるため、コメントを含める必要もありません。
Muhd

4
良い解決策ですが、file://でテストしている場合は機能しません
kampsj 14年

1
@kampsjで何をしなければならないのか
RameshVel

3
こんにちは@kampsj、file://プロトコルでテストすると、動作しないものがさらに多くなります。node.jsを使用すると、非常に迅速で簡単な静的HTMLサーバーを作成できます。 stackoverflow.com/questions/16333790/...
ジェス

2
このプラグインはもはや維持されておらず、著者自身が代わりに他のプラグインを使用することを提案しています。
JanErikGunnar 2017年

77

SitePointで友人からこの宝石を見つけました。 https://www.sitepoint.com/url-parameters-jquery/

PURE jQueryの使用。私はこれを使っただけでうまくいきました。例えば日本酒のためにそれを少し微調整しました。

//URL is http://www.example.com/mypage?ref=registration&email=bobo@example.com

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('ref')); //registration
console.log($.urlParam('email')); //bobo@example.com

そのままお使いください。


すごい。ありがとう!ただし、最後の閉じ中括弧タグは必要ないと思います。
bhtabor 2016

ああそうです、あなたは正しいです。投稿を編集しました。それは私のコードのいくつかのifステートメントから残っていました。ありがとう。
ClosDesign 2016

1
.hrefの代わりにwindow.location.searchを使用する必要があります-それ以外の場合は問題ありません。
BrainSlugs83 2017年

4
の代わりにresults[1] || 0、(結果){return results [1]}が0を返す場合に実行する必要があります。bcozクエリパラメータがまったく存在しない可能性があります。そして、変更はすべての一般的なケースを処理します。
myDoggyWritesCode

1
次のようなことがあればどうしますhttps://example.com/?c=Order+IDか?その正符号はまだこの関数に残っています。
Volomike、

47

これは私のコードサンプルではありませんが、過去に使用しました。

//First Add this to extend jQuery

    $.extend({
      getUrlVars: function(){
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for(var i = 0; i < hashes.length; i++)
        {
          hash = hashes[i].split('=');
          vars.push(hash[0]);
          vars[hash[0]] = hash[1];
        }
        return vars;
      },
      getUrlVar: function(name){
        return $.getUrlVars()[name];
      }
    });

    //Second call with this:
    // Get object of URL parameters
    var allVars = $.getUrlVars();

    // Getting URL var by its name
    var byName = $.getUrlVar('name');

2
「=」で分割しないでください。キーと値のペアの値に2番目の等号を含めることは技術的に問題ありません。-最初に出現する等号(キー/値のペアごと)のみを区切り文字として扱う必要があります。(また、等号は厳密には必要ありません。値のないキーを使用することもできます。)
BrainSlugs83 '28

きれいな溶液。私の場合、完全に機能しました。
JFガニオン

$ .extend({getUrlVars:function(){var vars = []、hash; var hashes = window.location.href.slice(window.location.href.indexOf( '?')+ 1).split( '& '); for(var i = 0; i <hashes.length; i ++){hash = hashes [i] .split(' = '); var k = hash.shift(); vars.push(k); vars [k] = hash.join( "");} return vars;}、getUrlVar:function(name){return $ .getUrlVars()[name];}});
Mupinc

15

クエリパラメータの名前を解析するだけでよい小さな関数を書きました。したがって、次の場合:?Project = 12&Mode = 200&date = 2013-05-27「Mode」パラメーターが必要な場合は、「Mode」名を解析して関数に入力するだけです。

function getParameterByName( name ){
    var regexS = "[\\?&]"+name+"=([^&#]*)", 
  regex = new RegExp( regexS ),
  results = regex.exec( window.location.search );
  if( results == null ){
    return "";
  } else{
    return decodeURIComponent(results[1].replace(/\+/g, " "));
  }
}

// example caller:
var result =  getParameterByName('Mode');

名前に迷惑メールがない場合は、最初の正規表現を削除できます
。location.search

7

上記の@Rob Neildの答えに基づいて、デコードされたクエリ文字列パラメーターの単純なオブジェクトを返す純粋なJS適応を以下に示します(%20などはありません)。

function parseQueryString () {
  var parsedParameters = {},
    uriParameters = location.search.substr(1).split('&');

  for (var i = 0; i < uriParameters.length; i++) {
    var parameter = uriParameters[i].split('=');
    parsedParameters[parameter[0]] = decodeURIComponent(parameter[1]);
  }

  return parsedParameters;
}

このコードを使用してエラーが発生したことはありません。どのブラウザを使用していますか?現在のFirefox、Chrome、Safariでテストしました。

うん、ごめんなさい。未定義を返す何かのメソッドを呼び出すのを見たと思った。つまり、実際には、実行する必要がないときに一度だけ実行されます。検索時です""。そして、{"": "undefined"}を取得します
ジェリナウ

うん。それはおそらくいくつかの精製を使用することができます。

1

バニラJavaScriptで記述

     //Get URL
     var loc = window.location.href;
     console.log(loc);
     var index = loc.indexOf("?");
     console.log(loc.substr(index+1));
     var splitted = loc.substr(index+1).split('&');
     console.log(splitted);
     var paramObj = [];
     for(var i=0;i<splitted.length;i++){
         var params = splitted[i].split('=');
         var key = params[0];
         var value = params[1];
         var obj = {
             [key] : value
         };
         paramObj.push(obj);
         }
    console.log(paramObj);
    //Loop through paramObj to get all the params in query string.

1
function parseQueryString(queryString) {
    if (!queryString) {
        return false;
    }

    let queries = queryString.split("&"), params = {}, temp;

    for (let i = 0, l = queries.length; i < l; i++) {
        temp = queries[i].split('=');
        if (temp[1] !== '') {
            params[temp[0]] = temp[1];
        }
    }
    return params;
}

私はこれを使います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.