我有这样的网址:
http://localhost/PMApp/temp.htm?ProjectID=462
我需要做的是在?
符号(查询字符串)后获取详细信息-即ProjectID=462
。如何使用JavaScript来获得?
到目前为止,我所做的是:
var url = window.location.toString();
url.match(?);
我不知道下一步该怎么做。
location.search
我有这样的网址:
http://localhost/PMApp/temp.htm?ProjectID=462
我需要做的是在?
符号(查询字符串)后获取详细信息-即ProjectID=462
。如何使用JavaScript来获得?
到目前为止,我所做的是:
var url = window.location.toString();
url.match(?);
我不知道下一步该怎么做。
location.search
Answers:
看一看的MDN文章有关window.location
。
QueryString在中可用window.location.search
。
同样适用于旧版浏览器的解决方案
MDN提供了一个示例(在以上引用的文章中不再提供),该示例说明如何获取QueryString中可用的单个键的值。像这样:
function getQueryStringValue (key) {
return decodeURIComponent(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURIComponent(key).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));
}
// Would write the value of the QueryString-variable called name to the console
console.log(getQueryStringValue("name"));
在现代浏览器中
在现代浏览器中,您具有searchParams
URL接口的属性,该属性返回URLSearchParams对象。返回的对象具有许多方便的方法,包括get方法。因此,与上述示例等效:
let params = (new URL(document.location)).searchParams;
let name = params.get("name");
该URLSearchParams接口也可以用于在查询字符串格式解析字符串,并把它们变成一个方便URLSearchParams对象。
let paramsString = "name=foo&age=1337"
let searchParams = new URLSearchParams(paramsString);
searchParams.has("name") === true; // true
searchParams.get("age") === "1337"; // true
请注意,该界面上仍然限制了浏览器支持,因此,如果您需要支持旧版浏览器,请坚持第一个示例或使用polyfill。
encodeURIComponent/decodeURIComponent
而不是escape/unescape
getQueryStringValue
旧版浏览器的第一个功能不适用于 ?foo=bar&foo1=bar1
如果我们尝试获取的值foo
,则返回empty string
。
decodeURI(window.location.search)
.replace('?', '')
.split('&')
.map(param => param.split('='))
.reduce((values, [ key, value ]) => {
values[ key ] = value
return values
}, {})
这将添加一个全局函数以作为映射访问queryString变量。
// -------------------------------------------------------------------------------------
// Add function for 'window.location.query( [queryString] )' which returns an object
// of querystring keys and their values. An optional string parameter can be used as
// an alternative to 'window.location.search'.
// -------------------------------------------------------------------------------------
// Add function for 'window.location.query.makeString( object, [addQuestionMark] )'
// which returns a queryString from an object. An optional boolean parameter can be
// used to toggle a leading question mark.
// -------------------------------------------------------------------------------------
if (!window.location.query) {
window.location.query = function (source) {
var map = {};
source = source || this.search;
if ("" != source) {
var groups = source, i;
if (groups.indexOf("?") == 0) {
groups = groups.substr(1);
}
groups = groups.split("&");
for (i in groups) {
source = groups[i].split("=",
// For: xxx=, Prevents: [xxx, ""], Forces: [xxx]
(groups[i].slice(-1) !== "=") + 1
);
// Key
i = decodeURIComponent(source[0]);
// Value
source = source[1];
source = typeof source === "undefined"
? source
: decodeURIComponent(source);
// Save Duplicate Key
if (i in map) {
if (Object.prototype.toString.call(map[i]) !== "[object Array]") {
map[i] = [map[i]];
}
map[i].push(source);
}
// Save New Key
else {
map[i] = source;
}
}
}
return map;
}
window.location.query.makeString = function (source, addQuestionMark) {
var str = "", i, ii, key;
if (typeof source == "boolean") {
addQuestionMark = source;
source = undefined;
}
if (source == undefined) {
str = window.location.search;
}
else {
for (i in source) {
key = "&" + encodeURIComponent(i);
if (Object.prototype.toString.call(source[i]) !== "[object Array]") {
str += key + addUndefindedValue(source[i]);
}
else {
for (ii = 0; ii < source[i].length; ii++) {
str += key + addUndefindedValue(source[i][ii]);
}
}
}
}
return (addQuestionMark === false ? "" : "?") + str.substr(1);
}
function addUndefindedValue(source) {
return typeof source === "undefined"
? ""
: "=" + encodeURIComponent(source);
}
}
请享用。
如果您碰巧使用Typescript并在的lib中拥有dom,则可以执行以下操作:
tsconfig.json
const url: URL = new URL(window.location.href);
const params: URLSearchParams = url.searchParams;
// get target key/value from URLSearchParams object
const yourParamValue: string = params.get('yourParamKey');
// To append, you can also leverage api to avoid the `?` check
params.append('newKey', 'newValue');
您可以使用此功能,以从?id =中分割字符串
function myfunction(myvar){
var urls = myvar;
var myurls = urls.split("?id=");
var mylasturls = myurls[1];
var mynexturls = mylasturls.split("&");
var url = mynexturls[0];
alert(url)
}
myfunction(window.top.location.href);
myfunction("http://www.myname.com/index.html?id=dance&emp;cid=in_social_facebook-hhp-food-moonlight-influencer_s7_20160623");
这是小提琴
您可以通过参数名称将其用于直接查找值。
const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');
您应该通过以下网址查看具有帮助方法的URL API URLSearchParams
:https : //developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
目前,并非所有现代浏览器都支持此功能,因此请不要忘记对其进行填充(可使用https://qa.polyfill.io/进行填充)。
var queryObj = {};
if(url.split("?").length>0){
var queryString = url.split("?")[1];
}
现在您在queryString中有查询部分
第一个替换将删除所有空白,第二个替换将所有'&'部分替换为“,”,最后第三个替换将将“:”替换为“ =”符号。
queryObj = JSON.parse('{"' + queryString.replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')
因此,假设您有一个类似abc = 123&efg = 456的查询。现在,在解析之前,您的查询将转换为类似{“ abc”:“ 123”,“ efg”:“ 456”}之类的内容。现在,当您解析它时,它将为您提供json对象中的查询。
试试这个
/**
* Get the value of a querystring
* @param {String} field The field to get the value of
* @param {String} url The URL to get the value from (optional)
* @return {String} The field value
*/
var getQueryString = function ( field, url ) {
var href = url ? url : window.location.href;
var reg = new RegExp( '[?&]' + field + '=([^&#]*)', 'i' );
var string = reg.exec(href);
return string ? string[1] : null;
};
假设您的网址是http://example.com&this=chicken&that=sandwich。您想要获得此,那个和另一个的价值。
var thisOne = getQueryString('this'); // returns 'chicken'
var thatOne = getQueryString('that'); // returns 'sandwich'
var anotherOne = getQueryString('another'); // returns null
如果要使用窗口中的URL以外的URL,则可以将URL作为第二个参数传递。
var yetAnotherOne = getQueryString('example', 'http://another-example.com&example=something'); // returns 'something'
我认为依赖浏览器比任何巧妙的正则表达式都更安全:
const parseUrl = function(url) {
const a = document.createElement('a')
a.href = url
return {
protocol: a.protocol ? a.protocol : null,
hostname: a.hostname ? a.hostname : null,
port: a.port ? a.port : null,
path: a.pathname ? a.pathname : null,
query: a.search ? a.search : null,
hash: a.hash ? a.hash : null,
host: a.host ? a.host : null
}
}
console.log( parseUrl(window.location.href) ) //stacksnippet
//to obtain a query
console.log( parseUrl( 'https://example.com?qwery=this').query )