如何从JavaScript检索GET参数

考虑:

http://example.com/page.html?returnurl=%2Fadmin

对于page.html中的js,它如何检索GET参数?

对于上面的简单例子,func('returnurl')应该是/admin

但它也应该适用于复杂的查询字符串…

674196 次浏览

使用window.location对象。这段代码提供了不带问号的GET。

window.location.search.substr(1)

在你的例子中,它将返回returnurl=%2Fadmin

编辑:我擅自更改了标准的答案,它是很好的,正如他指出的那样,我完全遵循了OP要求:

function findGetParameter(parameterName) {
var result = null,
tmp = [];
location.search
.substr(1)
.split("&")
.forEach(function (item) {
tmp = item.split("=");
if (tmp[0] === parameterName) result = decodeURIComponent(tmp[1]);
});
return result;
}

我从他的代码中删除了重复的函数执行,替换为一个变量(tmp),还添加了decodeURIComponent,完全符合OP的要求。我不确定这是不是安全问题。

或者使用普通的for循环,即使在IE8中也能工作:

function findGetParameter(parameterName) {
var result = null,
tmp = [];
var items = location.search.substr(1).split("&");
for (var index = 0; index < items.length; index++) {
tmp = items[index].split("=");
if (tmp[0] === parameterName) result = decodeURIComponent(tmp[1]);
}
return result;
}

你可以在位置对象中使用搜索函数。搜索函数提供URL的参数部分。详细信息可以在Location Object .中找到。

你将不得不解析结果字符串来获得变量和它们的值,例如在'='上拆分它们。

window.location.search返回从?上。下面的代码将删除?,使用split将键/值数组分开,然后将命名属性分配给参数个数对象:

function getSearchParameters() {
var prmstr = window.location.search.substr(1);
return prmstr != null && prmstr != "" ? transformToAssocArray(prmstr) : {};
}


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


var params = getSearchParameters();

然后你可以通过调用params.testhttp://myurl.com/?test=1中获得测验参数。

一种更花哨的方法::)

var options = window.location.search.slice(1)
.split('&')
.reduce(function _reduce (/*Object*/ a, /*String*/ b) {
b = b.split('=');
a[b[0]] = decodeURIComponent(b[1]);
return a;
}, {});

博士tl;解决方案在一行代码上使用香草JavaScript

var queryDict = {}
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})

这是简单的解决方案。不幸的是处理多值键和编码字符。

"?a=1&a=%2Fadmin&b=2&c=3&d&e"
> queryDict
a: "%2Fadmin"  // Overridden with the last value, not decoded.
b: "2"
c: "3"
d: undefined
e: undefined

多值的键编码字符?

参见如何在JavaScript中获得查询字符串值?< / >的原始答案。

"?a=1&b=2&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab&a=%2Fadmin"
> queryDict
a: ["1", "5", "t e x t", "/admin"]
b: ["2"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

在你的例子中,你可以像这样访问这个值:

"?returnurl=%2Fadmin"
> qd.returnurl    // ["/admin"]
> qd['returnurl'] // ["/admin"]
> qd.returnurl[0] // "/admin"

我的解决方案扩展了@tak3r的。

当没有查询参数时,它返回一个空对象,并支持数组符号?a=1&a=2&a=3:

function getQueryParams () {
function identity (e) { return e; }
function toKeyValue (params, param) {
var keyValue = param.split('=');
var key = keyValue[0], value = keyValue[1];


params[key] = params[key]?[value].concat(params[key]):value;
return params;
}
return decodeURIComponent(window.location.search).
replace(/^\?/, '').split('&').
filter(identity).
reduce(toKeyValue, {});
}

我这样做(检索一个特定的get-parameter,这里'parameterName'):

var parameterValue = decodeURIComponent(window.location.search.match(/(\?|&)parameterName\=([^&]*)/)[2]);

如果您不介意使用库而不是滚动自己的实现,请查看https://github.com/jgallen23/querystring

var getQueryParam = function(param) {
var found;
window.location.search.substr(1).split("&").forEach(function(item) {
if (param ==  item.split("=")[0]) {
found = item.split("=")[1];
}
});
return found;
};

这个解决方案处理URL解码:

var params = function() {
function urldecode(str) {
return decodeURIComponent((str+'').replace(/\+/g, '%20'));
}


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


var prmstr = window.location.search.substr(1);
return prmstr != null && prmstr != "" ? transformToAssocArray(prmstr) : {};
}();

用法:

console.log('someParam GET value is', params['someParam']);

如果你正在使用AngularJS,你可以使用ngRoute模块使用$routeParams

你必须添加一个模块到你的应用程序

angular.module('myApp', ['ngRoute'])

现在你可以使用服务$routeParams:

.controller('AppCtrl', function($routeParams) {
console.log($routeParams); // JSON object
}

这个函数使用正则表达式,如果参数不存在或没有任何值,则返回null:

function getQuery(q) {
return (window.location.search.match(new RegExp('[?&]' + q + '=([^&]+)')) || [, null])[1];
}

获取JSON对象的参数:

console.log(getUrlParameters())


function getUrlParameters() {
var out = {};
var str = window.location.search.replace("?", "");
var subs = str.split(`&`).map((si)=>{var keyVal = si.split(`=`); out[keyVal[0]]=keyVal[1];});
return out
}

我创建了一个简单的JavaScript函数来从URL访问GET参数。

只要包含这个JavaScript源代码,你就可以访问get参数。 例如:在http://example.com/index.php?language=french中,language变量可以被访问为$_GET["language"]。类似地,所有参数的列表将作为数组存储在变量$_GET_Params中。JavaScript和HTML都在下面的代码片段中提供

<!DOCTYPE html>
<html>
<body>
<!-- This script is required -->
<script>
function $_GET() {
// Get the Full href of the page e.g. http://www.google.com/files/script.php?v=1.8.7&country=india
var href = window.location.href;


// Get the protocol e.g. http
var protocol = window.location.protocol + "//";


// Get the host name e.g. www.google.com
var hostname = window.location.hostname;


// Get the pathname e.g. /files/script.php
var pathname = window.location.pathname;


// Remove protocol part
var queries = href.replace(protocol, '');


// Remove host part
queries = queries.replace(hostname, '');


// Remove pathname part
queries = queries.replace(pathname, '');


// Presently, what is left in the variable queries is : ?v=1.8.7&country=india


// Perform query functions if present
if (queries != "" && queries != "?") {


// Remove question mark '?'
queries = queries.slice(1);


// Split all the different queries
queries = queries.split("&");


// Get the number of queries
var length = queries.length;


// Declare global variables to store keys and elements
$_GET_Params = new Array();
$_GET = {};


// Perform functions per query
for (var i  = 0; i < length; i++) {


// Get the present query
var key = queries[i];


// Split the query and the value
key = key.split("=");


// Assign value to the $_GET variable
$_GET[key[0]] = [key[1]];


// Assign value to the $_GET_Params variable
$_GET_Params[i] = key[0];
}
}
}


// Execute the function
$_GET();
</script>
<h1>GET Parameters</h1>
<h2>Try to insert some get parameter and access it through JavaScript</h2>
</body>
</html>

在这里,我用这段代码将GET参数转换为一个对象,以便更容易地使用它们。

// Get Nav URL
function getNavUrl() {
// Get URL
return window.location.search.replace("?", "");
};


function getParameters(url) {
// Params obj
var params = {};
// To lowercase
url = url.toLowerCase();
// To array
url = url.split('&');


// Iterate over URL parameters array
var length = url.length;
for(var i=0; i<length; i++) {
// Create prop
var prop = url[i].slice(0, url[i].search('='));
// Create Val
var value = url[i].slice(url[i].search('=')).replace('=', '');
// Params New Attr
params[prop] = value;
}
return params;
};


// Call of getParameters
console.log(getParameters(getNavUrl()));

你应该使用URL和URLSearchParams本地函数:

let url = new URL("https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8&q=mdn%20query%20string")
let params = new URLSearchParams(url.search);
let sourceid = params.get('sourceid') // 'chrome-instant'
let q = params.get('q') // 'mdn query string'
let ie = params.has('ie') // true
params.append('ping','pong')


console.log(sourceid)
console.log(q)
console.log(ie)
console.log(params.toString())
console.log(params.get("ping"))

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://polyfill.io/v2/docs/features/ < / p >

下面是另一个基于Kat和Bakudan的例子的例子,但是让它更通用一点。

function getParams ()
{
var result = {};
var tmp = [];


location.search
.substr (1)
.split ("&")
.forEach (function (item)
{
tmp = item.split ("=");
result [tmp[0]] = decodeURIComponent (tmp[1]);
});


return result;
}


location.getParams = getParams;


console.log (location.getParams());
console.log (location.getParams()["returnurl"]);