ChatGPT解决这个技术问题 Extra ChatGPT

Get the values from the "GET" parameters (JavaScript) [duplicate]

This question already has answers here: How can I get query string values in JavaScript? (73 answers) Closed 8 months ago.

I have a URL with some GET parameters as follows:

www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 

I need to get the whole value of c. I tried to read the URL, but I got only m2. How do I do this using JavaScript?

Before you post a new answer, consider there are already 50+ answers for this question. Please, make sure that your answer contributes information that is not among existing answers.
var url_string = "example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href var url = new URL(url_string); var c = url.searchParams.get("c"); console.log(c);
It is insane that a, what is should be, simple question for JS requires 50+ answers :/

Q
Quentin

JavaScript itself has nothing built in for handling query string parameters.

Code running in a (modern) browser can use the URL object (which is part of the APIs provided by browsers to JS):

var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href var url = new URL(url_string); var c = url.searchParams.get("c"); console.log(c);

For older browsers (including Internet Explorer), you can use this polyfill.

You could also use the code from the original version of this answer that predates URL. The above polyfill is robust and well tested and I strongly recommend it over this though.

You could access location.search, which would give you from the ? character on to the end of the URL or the start of the fragment identifier (#foo), whichever comes first.

Then you can parse it with this:

function parse_query_string(query) { var vars = query.split("&"); var query_string = {}; for (var i = 0; i < vars.length; i++) { var pair = vars[i].split("="); var key = decodeURIComponent(pair.shift()); var value = decodeURIComponent(pair.join("=")); // If first entry with this name if (typeof query_string[key] === "undefined") { query_string[key] = value; // If second entry with this name } else if (typeof query_string[key] === "string") { var arr = [query_string[key], value]; query_string[key] = arr; // If third or later entry with this name } else { query_string[key].push(value); } } return query_string; } var query_string = "a=1&b=3&c=m2-m3-m4-m5"; var parsed_qs = parse_query_string(query_string); console.log(parsed_qs.c);

You can get the query string from the URL of the current page with:

var query = window.location.search.substring(1);
var qs = parse_query_string(query);

For older browsers, you may need a polyfill for URL in addition to the one for URLSearchParams. Or you can dodge this issue by replacing the line var c = url.searchParams.get("c"); in the answer above with var c = new URLSearchParams(window.location.search).get("c");.
@Jamland — Absolutely do not do that. It will break things. Here is a live demo new URL() expects to receive a properly encoded URL as its argument. decodeURIComponent expects to be passed a component of a URL, not a whole URL.
@Quentin I have checked different special chars and I see you are right. decodeURIComponent shouldn't be used in this case
the first solution can't be used in situation when your url is like :"localhost:"
@Snowmanzzz — localhost: is not a valid URL. http://localhost/path?query=something would be. http://localhost:80/path?query=something would be. The URL object handles them just fine.
B
Brendan Nee

Most implementations I've seen miss out URL-decoding the names and the values.

Here's a general utility function that also does proper URL-decoding:

function getQueryParams(qs) {
    qs = qs.split('+').join(' ');

    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);

This code doesn't work. It creates an infinite loop because the regex is compiled in the loop definition which resets the current index. It works properly if you put the regex into a variable outside of the loop.
@maxhawkins: It works in some browsers while it would go into an infinite loop in others. You're half-right in that regard. I will fix the code to be cross-browser. Thanks for pointing that out!
@ZiTAL This function is to be used with the query part of a URL, not the entire URL. See the commented-out usage example below.
@Harvey Case insensitivity is not a concern of query parameters. It sounds like an application-specific thing that should be applied along with, or on top of query parameter extraction.
Why qs.split('+').join(' '); and not qs.replace(/\+/g, ' '); ?
G
GROVER.

source

function gup( name, url ) {
    if (!url) url = location.href;
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( url );
    return results == null ? null : results[1];
}
gup('q', 'hxxp://example.com/?q=abc')

I like this option best, but prefer to return null, or the result, but not an empty string.
It looks like you have some extra escape chars. "\\[" should be "\[". Since those are regular strings, the [ and ] don't need to be escaped.
This is not case insensitive. Where would I add the "i" to make it case insensitive?
alert(gup('UserID', window.location.href));
if there is no parameters in the URL, results will be Null and generate an error. testing for null before attempting to parse the array could be better
v
vinzee

This is an easy way to check just one parameter:

Example URL:

http://myserver/action?myParam=2

Example Javascript:

var myParam = location.search.split('myParam=')[1]

if "myParam" exists in the URL... variable myParam will contain "2", otherwise it will be undefined.

Maybe you want a default value, in that case:

var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';

Update: This works better:

var url = "http://www.example.com/index.php?myParam=384&login=admin"; // or window.location.href for current url
var captured = /myParam=([^&]+)/.exec(url)[1]; // Value is in [1] ('384' in our case)
var result = captured ? captured : 'myDefaultValue';

And it works right even when URL is full of parameters.


This only works if the parameter you're grabbing is the last one in the URL, which you shouldn't depend on (even if you're only expecting one parameter). e.g. http://myserver/action?myParam=2&anotherParam=3 would yield not "2" but "2&anotherParam=3".
(location.search.split('myParam=')[1]||'').split('&')[0] -- to use with multiple params or possibliy missing myParam.
or location.search.split('myParam=').splice(1).join('').split('&')[0]
You can gain more precision and allow any order of parameters by prepending with [?|&] as in [?|&]myParam=([^&]+)
You may need to decode the value result = decodeURIComponent(result);
c
cgatian

Browsers vendors have implemented a native way to do this via URL and URLSearchParams.

let url = new URL('http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5');
let searchParams = new URLSearchParams(url.search);
console.log(searchParams.get('c'));  // outputs "m2-m3-m4-m5"

Currently supported in Firefox, Opera, Safari, Chrome and Edge. For a list of browser support see here.

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

https://url.spec.whatwg.org/

Eric Bidelman, an engineer at Google, recommends using this polyfill for unsupported browsers.


According to the MDN link(s) Safari support URL but not URLSearchParams.
@Markouver Isn't the polyfill take care of that? BTW, Safari is the modern days' IE6
Why is new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a') returning null for me? (On Chrome stable). b and c seem to work well.
Updated answer. My original answer was not properly using URLSearchParams, as it's only designed to work with the querystring portion of the URL.
Use url.searchParams instead new URLSearchParams(url.search).
V
VaMoose

I found this ages ago, very easy:

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }

Then call it like this:

var fType = getUrlVars()["type"];

short + simple + powerful = great
Very nice, it also works using location.search instead of window.location.href
@pdxbmw It is useless and should be removed. The code may seem clever at first glance, but isn't very well thought out. Improvements: Use decodeURIComponent() on value, because that's what you usually want to work with; use window.location.search instead of window.location.href, because you are only interested in the parameters, not the whole url.
I used it in my es6 project: decodeURIComponent(window.location.search).replace(/[?&]+([^=&]+)=([^&]*)/g, (m, key, value) => params[key] = value);
@Leif suggestion worked great. I was getting in an ID 142# because at the end of the URL was the # generated on a button click. Leaving the function like this var vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
B
Ben Mosher

You can get the query string in location.search, then you can split everything after the question mark:

var params = {};

if (location.search) {
    var parts = location.search.substring(1).split('&');

    for (var i = 0; i < parts.length; i++) {
        var nv = parts[i].split('=');
        if (!nv[0]) continue;
        params[nv[0]] = nv[1] || true;
    }
}

// Now you can get the parameters you want like so:
var abc = params.abc;

What about URL-decoding the parameter names and values?
This approach doesn't handle arrays. E.g. ?array[]=1&array[]=2 produces {"array[]": "2"}, which is clearly wrong.
@Kafoso There is no clear right or wrong here. First of all, repeated fields with the same names have no specified standard behavior, and is up to the parser to handle. Additionally, the [] pattern only has a meaning in some cases (e.g., PHP), but not others. So not "clearly wrong" – just not implemented to handle a non-standard case that you may or may not need to handle.
s
spencer.sm

A super simple way using URLSearchParams.

function getParam(param){
  return new URLSearchParams(window.location.search).get(param);
}

It's currently supported in Chrome, Firefox, Safari, Edge, and others.


Get the error: 'SCRIPT5009: 'URLSearchParams' is not defined' when running in Edge.
@AndreasPresthammer What version of edge?
@spencer-sm Microsoft Edge 41.16299.820.0
@iiiml0sto1 What are "prettified URL parameters" ?
N
Natus Drew

I wrote a more simple and elegant solution.

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];

Look at that, two lines, does exactly what it says on the tin - and won't break if someone is trying to probe for vulnerabilities and adds a bunch of extra characters and queries unlike a couple of these solutions. Cheers chap!
This does the job right and only in 2 lines. Great answer!
I think it would be handy for other a check for null was included. If not, an example is here: stackoverflow.com/a/36076822/1945948 (I had an edit attempt rejected).
Don't understand... how does this answer the question, which is about getting params from a specific string, 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5'?
Loved this answer, +1'ed. Just a suggestion, you can replace [0-9] for \d
M
Mohd Abdul Mujib

Here is a recursive solution that has no regex, and has minimal mutation (only the params object is mutated, which I believe is unavoidable in JS).

It's awesome because it:

Is recursive

Handles multiple parameters of the same name

Deals well with malformed parameter strings (missing values, so on)

Doesn't break if '=' is in the value

Performs URL decoding

And lastly, It's awesome because it...argh!!!

Code:

var get_params = function(search_string) {

  var parse = function(params, pairs) {
    var pair = pairs[0];
    var parts = pair.split('=');
    var key = decodeURIComponent(parts[0]);
    var value = decodeURIComponent(parts.slice(1).join('='));

    // Handle multiple parameters of the same name
    if (typeof params[key] === "undefined") {
      params[key] = value;
    } else {
      params[key] = [].concat(params[key], value);
    }

    return pairs.length == 1 ? params : parse(params, pairs.slice(1))
  }

  // Get rid of leading ?
  return search_string.length == 0 ? {} : parse({}, search_string.substr(1).split('&'));
}

var params = get_params(location.search);

// Finally, to get the param you want
params['c'];

You... you said recursive twice.
It can't find the first param in the next url : www.mysite.com?first=1&second=2
Hi Mario, here is a JSFiddle showing it working with that URL: jsfiddle.net/q6xfJ - If you have found an error, is this perhaps browser specific? When testing, please note that the answer I supplied uses location.search, which is the '?first=1&second=2' part of the URL. Cheers :)
I don't see why something is good just because it is recursive.
Erm, I think you missed the recursion joke there Adam. Although now everyone will miss it because edi9999 removed the second "Is recursive".
N
Nate

I made a function that does this:

var getUrlParams = function (url) {
  var params = {};
  (url + '?').split('?')[1].split('&').forEach(function (pair) {
    pair = (pair + '=').split('=').map(decodeURIComponent);
    if (pair[0].length) {
      params[pair[0]] = pair[1];
    }
  });
  return params;
};

Update 5/26/2017, here is an ES7 implementation (runs with babel preset stage 0, 1, 2, or 3):

const getUrlParams = url => `${url}?`.split('?')[1]
  .split('&').reduce((params, pair) =>
    ((key, val) => key ? {...params, [key]: val} : params)
    (...`${pair}=`.split('=').map(decodeURIComponent)), {});

Some tests:

console.log(getUrlParams('https://google.com/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('https://google.com/')); // Will log {}
console.log(getUrlParams('a=1&b=2&c')); // Will log {}

Update 3/26/2018, here is a Typescript implementation:

const getUrlParams = (search: string) => `${search}?`
  .split('?')[1]
  .split('&')
  .reduce(
    (params: object, pair: string) => {
      const [key, value] = `${pair}=`
        .split('=')
        .map(decodeURIComponent)

      return key.length > 0 ? { ...params, [key]: value } : params
    },
    {}
  )

Update 2/13/2019, here is an updated TypeScript implementation that works with TypeScript 3.

interface IParams { [key: string]: string }

const paramReducer = (params: IParams, pair: string): IParams => {
  const [key, value] = `${pair}=`.split('=').map(decodeURIComponent)

  return key.length > 0 ? { ...params, [key]: value } : params
}

const getUrlParams = (search: string): IParams =>
  `${search}?`.split('?')[1].split('&').reduce<IParams>(paramReducer, {})

On a URL without query parameters this will return Object {"": ""}
Looks clean enough to me. The rest of the answers are just too much "magic" without enough explanation.
This is an awesome answer!
Thanks @SpencerBigum !
P
Peter Mortensen

See this

function getURLParameters(paramName)
{
    var sURL = window.document.URL.toString();
    if (sURL.indexOf("?") > 0)
    {
        var arrParams = sURL.split("?");
        var arrURLParams = arrParams[1].split("&");
        var arrParamNames = new Array(arrURLParams.length);
        var arrParamValues = new Array(arrURLParams.length);

        var i = 0;
        for (i = 0; i<arrURLParams.length; i++)
        {
            var sParam =  arrURLParams[i].split("=");
            arrParamNames[i] = sParam[0];
            if (sParam[1] != "")
                arrParamValues[i] = unescape(sParam[1]);
            else
                arrParamValues[i] = "No Value";
        }

        for (i=0; i<arrURLParams.length; i++)
        {
            if (arrParamNames[i] == paramName)
            {
                //alert("Parameter:" + arrParamValues[i]);
                return arrParamValues[i];
            }
        }
        return "No Parameters Found";
    }
}

Z
Zon

The shortest way:

new URL(location.href).searchParams.get("my_key");

I would favor using new URL(location.href).searchParams.get("my_key") over URLSearchParams since the latter will fail when retrieving the first query parameter of any URL.
Tested both variants. I agree with you. Edited the answer.
v
veiset

ECMAScript 6 solution:

var params = window.location.search
  .substring(1)
  .split("&")
  .map(v => v.split("="))
  .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())

Nice. FYI, because it's a Map, usage is params.get("key");
I like it but probably it won't get the first param. I created a function based on your example function urlParams(url) { const [, searchParams = ''] = url.split('?') return searchParams.split('&') .map(v => v.split('=')) .reduce((map, [key = '', value]) => key.length ? map.set(key, decodeURIComponent(value)) : map, new Map()) }
N
Norbert

I use the parseUri library. It allows you to do exactly what you are asking for:

var uri = 'www.test.com/t.html&a=1&b=3&c=m2-m3-m4-m5';
var c = uri.queryKey['c'];
// c = 'm2-m3-m4-m5'

F
Fancyoung

I use

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}

Please add some explanation. Your answer is currently flagged "low quality" and might eventually be removed without.
I found that if there has a string like '#id' at the end of the url,and return the last parameter value like 'somevalue#id'
@Ayano window.location.search won't include hash like #id.
@Fancyoung Yes,you are right,i made a mistake that use location.hrefto match the result instead of the location.search.Thank you.
T
Tyson

this question has too many answers, so i'm adding another one.

/**
 * parses and returns URI query parameters 
 * 
 * @param {string} param parm
 * @param {bool?} asArray if true, returns an array instead of a scalar 
 * @returns {Object|Array} 
 */
function getURIParameter(param, asArray) {
    return document.location.search.substring(1).split('&').reduce(function(p,c) {
        var parts = c.split('=', 2).map(function(param) { return decodeURIComponent(param); });
        if(parts.length == 0 || parts[0] != param) return (p instanceof Array) && !asArray ? null : p;
        return asArray ? p.concat(parts.concat(true)[1]) : parts.concat(true)[1];
    }, []);
}

usage:

getURIParameter("id")  // returns the last id or null if not present
getURIParameter("id", true) // returns an array of all ids

this copes with empty parameters (those keys present without "=value"), exposure of both a scalar and array-based value retrieval API, as well as proper URI component decoding.


F
Folusho Oladipo

Here is my solution. As advised by Andy E while answering this question, it's not good for your script's performance if it's repeatedly building various regex strings, running loops etc just to get a single value. So, I've come up with a simpler script that returns all the GET parameters in a single object. You should call it just once, assign the result to a variable and then, at any point in the future, get any value you want from that variable using the appropriate key. Note that it also takes care of URI decoding (i.e things like %20) and replaces + with a space:

 function getUrlQueryParams(url) {
  var queryString = url.split("?")[1];
  var keyValuePairs = queryString.split("&");
  var keyValue = [];
  var queryParams = {};
  keyValuePairs.forEach(function(pair) {
    keyValue = pair.split("=");
    queryParams[keyValue[0]] = decodeURIComponent(keyValue[1]).replace(/\+/g, " ");
});
  return queryParams;
}

So, here are are a few tests of the script for you to see:

// Query parameters with strings only, no special characters.
var currentParams = getUrlQueryParams("example.com/foo?number=zero");
alert(currentParams["number"]); // Gives "zero".

// For the URL you stated above...
var someParams = getUrlQueryParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 ");
alert(someParams["c"]); // Gives "m2-m3-m4-m5".

// For a query params with URI encoding...
var someParams = getUrlQueryParams("www.example.com/t.html?phrase=a%20long%20shot&location=Silicon+Valley%2C+USA");
alert(someParams["phrase"]); // Gives "a long shot".
alert(someParams["location"]); // Gives "Silicon Valley, USA".

.replace("+", " ") will only replace the first occurrence You need to use .replace(/\+/g, " ");
s
simhumileco

The easiest way using the replace() method:

From the urlStr string:

paramVal = urlStr.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

or from the current URL:

paramVal = document.URL.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

Explanation:

document.URL - interface returns the document location (page url) as a string.

replace() - method returns a new string with some or all matches of a pattern replaced by a replacement.

/.*param_name=([^&]*).*/ - the regular expression pattern enclosed between slashes which means: .* - zero or more of any characters, param_name= - param name which is serched, () - group in regular expression, [^&]* - one or more of any characters excluding &, | - alternation, $1 - reference to first group in regular expression.

.* - zero or more of any characters,

param_name= - param name which is serched,

() - group in regular expression,

[^&]* - one or more of any characters excluding &,

| - alternation,

$1 - reference to first group in regular expression.

var urlStr = 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5'; var c = urlStr.replace(/.*c=([^&]*).*|(.*)/, '$1'); var notExisted = urlStr.replace(/.*not_existed=([^&]*).*|(.*)/, '$1'); console.log(`c === '${c}'`); console.log(`notExisted === '${notExisted}'`);


Nice solution, but if the parameter is not found, the whole string is returned. I would expect "undefined" in this case.
Hi @pensan, thank you for your great comment. I just add to the regular expression the handling of the situation when the parameter does not appear in the URL. In this case we get the emty string (not whole string).
e
equazcion

Yet another suggestion.

There are some good answers already, but I found them needlessly complex and hard to understand. This is short, simple, and returns a simple associative array with key names corresponding to the token names in the URL.

I added a version with comments below for those who want to learn.

Note this relies on jQuery ($.each) for its loop, which I recommend instead of forEach. I find it simpler to ensure cross-browser compatibility using jQuery across the board rather than plugging in individual fixes to support whichever new functions aren't supported in older browsers.

Edit: After I wrote this I noticed Eric Elliott's answer, which is almost the same, though it uses forEach, while I'm generally against (for reasons stated above).

function getTokens(){
    var tokens = [];
    var query = location.search;
    query = query.slice(1);
    query = query.split('&');
    $.each(query, function(i,value){    
        var token = value.split('=');   
        var key = decodeURIComponent(token[0]);     
        var data = decodeURIComponent(token[1]);
        tokens[key] = data;
    });
    return tokens;
}

Commented version:

function getTokens(){
    var tokens = [];            // new array to hold result
    var query = location.search; // everything from the '?' onward 
    query = query.slice(1);     // remove the first character, which will be the '?' 
    query = query.split('&');   // split via each '&', leaving us an array of something=something strings

    // iterate through each something=something string
    $.each(query, function(i,value){    

        // split the something=something string via '=', creating an array containing the token name and data
        var token = value.split('=');   

        // assign the first array element (the token name) to the 'key' variable
        var key = decodeURIComponent(token[0]);     

        // assign the second array element (the token data) to the 'data' variable
        var data = decodeURIComponent(token[1]);

        tokens[key] = data;     // add an associative key/data pair to our result array, with key names being the URI token names
    });

    return tokens;  // return the array
}

For the examples below we'll assume this address:

http://www.example.com/page.htm?id=4&name=murray

You can assign the URL tokens to your own variable:

var tokens = getTokens();

Then refer to each URL token by name like this:

document.write( tokens['id'] );

This would print "4".

You can also simply refer to a a token name from the function directly:

document.write( getTokens()['name'] );

...which would print "murray".


G
Gus

Or if you don't want to reinvent the URI parsing wheel use URI.js

To get the value of a parameter named foo:

new URI((''+document.location)).search(true).foo

What that does is

Convert document.location to a string (it's an object) Feed that string to URI.js's URI class construtor Invoke the search() function to get the search (query) portion of the url (passing true tells it to output an object) Access the foo property on the resulting object to get the value

Here's a fiddle for this.... http://jsfiddle.net/m6tett01/12/


R
Ravi Patel

For Single Parameter Value like this index.html?msg=1 use following code,

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search.substring(1);
    var varArray = queryString.split("="); //eg. index.html?msg=1

    var param1 = varArray[0];
    var param2 = varArray[1];

}

For All Parameter Value use following Code,

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search;
    var varArray = queryString.split("&");
    for (var i=0;i<varArray.length;i++) {
      var param = varArray[i].split("=");
        //parameter-value pair
    }
} 

I like this solution!
S
Sariban D'Cl

Here I am posting one example. But it's in jQuery. Hope it will help others:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990-->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')          // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')   // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});
</script>

Copied from your other post: "Requires the url plugin : plugins.jquery.com/url"
t
thezar
// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
    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;
}

// Usage for URL: http://my.site.com/location?locationId=53cc272c0364aefcb78756cd&shared=false
var id = getUrlVars()["locationId"];

Got from here: http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html


W
Waseem Khan

I had the need to read a URL GET variable and complete an action based on the url parameter. I searched high and low for a solution and came across this little piece of code. It basically reads the current page url, perform some regular expression on the URL then saves the url parameters in an associative array, which we can easily access.

So as an example if we had the following url with the javascript at the bottom in place.

http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July

All we’d need to do to get the parameters id and page are to call this:

The Code will be:

<script type="text/javascript">
var first = getUrlVars()["year"];
var second = getUrlVars()["Month"];

alert(first);
alert(second);
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>

I don't get why you rolled back my edit of your answer. However you'r welcome to improve it your self :)
Not working for URL like -> ?action=api_call&dates[]=2022-01-28&dates[]=2022-02-03
S
Sudhakar Reddy

Simple way

function getParams(url){
        var regex = /[?&]([^=#]+)=([^&#]*)/g,
            params = {},
            match;
        while(match = regex.exec(url)) {
            params[match[1]] = match[2];
        }
        return params;
    }

then call it like getParams(url)


佚名

Elegant, functional style solution

Let's create an object containing URL param names as keys, then we can easily extract the parameter by its name:

// URL: https://example.com/?test=true&orderId=9381  

// Build an object containing key-value pairs
export const queryStringParams = window.location.search
  .split('?')[1]
  .split('&')
  .map(keyValue => keyValue.split('='))
  .reduce<QueryStringParams>((params, [key, value]) => {
    params[key] = value;
    return params;
  }, {});

type QueryStringParams = {
  [key: string]: string;
};


// Return URL parameter called "orderId"
return queryStringParams.orderId;

love this, but didn't work for me without making sure to return the accumulator in the reduce function
@Ella it was a typo, there is no way it can work without a return
Looks better now, let's hope you make it to the first page!
K
Khalil Mejdi

It's the N++ time I am looking for a clean way to do this. Will save this here in case I get back cause I know I will... 🙄

const parseUrlQuery = (value) => { var urlParams = new URL(value).searchParams return Array.from(urlParams.keys()).reduce((acc, key) => { acc[key] = urlParams.getAll(key) return acc }, {}) } console.log(parseUrlQuery('http://url/path?param1=A¶m1=B¶m2=ABC¶m3=61569'))


B
Bobb Fwed

Here is what I do:

var uriParams = getSearchParameters();
alert(uriParams.c);


// background functions:

// Get object/associative array of URL parameters
function getSearchParameters () {
  var prmstr = window.location.search.substr(1);
  return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {};
}

// convert parameters from url-style string to associative array
function transformToAssocArray (prmstr) {
  var params = {},
      prmarr = prmstr.split("&");

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}

s
strangeqargo
// http:localhost:8080/path?param_1=a&param_2=b
var getParamsMap = function () {
    var params = window.location.search.split("&");
    var paramsMap = {};
    params.forEach(function (p) {
        var v = p.split("=");
        paramsMap[v[0]]=decodeURIComponent(v[1]);
    });
    return paramsMap;
};

// -----------------------

console.log(getParamsMap()["param_1"]);  // should log "a"     

This returns the first parameter with '?'