Tôi có một URL với một số tham số GET như sau:
www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5
Tôi cần phải có được toàn bộ giá trị của c
. Tôi đã cố đọc URL, nhưng tôi chỉ nhận được m2
. Làm cách nào để sử dụng JavaScript?
Tôi có một URL với một số tham số GET như sau:
www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5
Tôi cần phải có được toàn bộ giá trị của c
. Tôi đã cố đọc URL, nhưng tôi chỉ nhận được m2
. Làm cách nào để sử dụng JavaScript?
Câu trả lời:
Bản thân JavaScript không có gì được xây dựng để xử lý các tham số chuỗi truy vấn.
Mã chạy trong trình duyệt (hiện đại), bạn có thể sử dụng URL
đối tượng (là một phần của API do trình duyệt cung cấp cho 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);
Đối với các trình duyệt cũ hơn (bao gồm cả Internet Explorer), bạn có thể sử dụng polyfill này hoặc mã từ phiên bản gốc của câu trả lời này có trước URL
:
Bạn có thể truy cập location.search
, sẽ cung cấp cho bạn từ ?
ký tự đến cuối URL hoặc bắt đầu từ định danh phân đoạn (#foo), tùy theo điều kiện nào đến trước.
Sau đó, bạn có thể phân tích nó với điều này:
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[0]);
var value = decodeURIComponent(pair[1]);
// If first entry with this name
if (typeof query_string[key] === "undefined") {
query_string[key] = decodeURIComponent(value);
// If second entry with this name
} else if (typeof query_string[key] === "string") {
var arr = [query_string[key], decodeURIComponent(value)];
query_string[key] = arr;
// If third or later entry with this name
} else {
query_string[key].push(decodeURIComponent(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);
Bạn có thể lấy chuỗi truy vấn từ URL của trang hiện tại bằng:
var query = window.location.search.substring(1);
var qs = parse_query_string(query);
URL
một trình duyệt cho URLSearchParams
. Hoặc bạn có thể tránh vấn đề này bằng cách thay thế dòng var c = url.searchParams.get("c");
trong câu trả lời ở trên bằng var c = new URLSearchParams(window.location.search).get("c");
.
new URL()
hy vọng sẽ nhận được một URL được mã hóa chính xác làm đối số của nó. decodeURIComponent
hy vọng sẽ được thông qua một thành phần của URL chứ không phải toàn bộ URL.
decodeURIComponent
không nên được sử dụng trong trường hợp này
parse_query_string
hàm thực hiện một đúp giải mã của value
. Việc =
ban hành được đề cập bởi @ManelClos có thể được giải quyết bằng cách thêm một tham số thứ hai 2
( limit
) vào vars[i].split()
.
Hầu hết các triển khai tôi đã thấy bỏ lỡ URL - giải mã tên và giá trị.
Đây là một chức năng tiện ích chung cũng giải mã URL thích hợp:
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);
qs.split('+').join(' ');
và không qs.replace(/\+/g, ' ');
?
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')
Đây là một cách dễ dàng để kiểm tra chỉ một tham số:
URL ví dụ:
http://myserver/action?myParam=2
Javascript ví dụ:
var myParam = location.search.split('myParam=')[1]
nếu "myParam" tồn tại trong URL ... biến myParam sẽ chứa "2", nếu không nó sẽ không được xác định.
Có thể bạn muốn một giá trị mặc định, trong trường hợp đó:
var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';
Cập nhật: Điều này hoạt động tốt hơn:
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';
Và nó hoạt động ngay cả khi URL có đầy đủ các tham số.
http://myserver/action?myParam=2&anotherParam=3
sẽ không mang lại "2"
nhưng "2&anotherParam=3"
.
(location.search.split('myParam=')[1]||'').split('&')[0]
- để sử dụng với nhiều param hoặc thiếu possibliy myParam
.
location.search.split('myParam=').splice(1).join('').split('&')[0]
[?|&]
như trong[?|&]myParam=([^&]+)
result = decodeURIComponent(result);
Các nhà cung cấp trình duyệt đã triển khai một cách riêng để thực hiện việc này thông qua URL và 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"
Hiện được hỗ trợ trong Firefox, Opera, Safari, Chrome và Edge. Để xem danh sách hỗ trợ trình duyệt xem tại đây .
https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URL/URL
Eric Bidelman, một kỹ sư tại Google, khuyên bạn nên sử dụng polyfill này cho các trình duyệt không được hỗ trợ.
new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')
lại trở về null
với tôi? (Trên Chrome ổn định). b
và c
dường như hoạt động tốt.
url.searchParams
thay thế new URLSearchParams(url.search)
.
Tôi tìm thấy điều này từ lâu, rất dễ dàng:
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
function(m,key,value) {
vars[key] = value;
});
return vars;
}
Sau đó gọi nó như thế này:
var fType = getUrlVars()["type"];
decodeURIComponent()
theo giá trị, vì đó là những gì bạn thường muốn làm việc với; sử dụng window.location.search
thay vì window.location.href
, vì bạn chỉ quan tâm đến các tham số, không phải toàn bộ url.
var vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Bạn có thể lấy chuỗi truy vấn location.search
, sau đó bạn có thể chia mọi thứ sau dấu chấm hỏi:
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;
?array[]=1&array[]=2
sản xuất {"array[]": "2"}
, đó là rõ ràng sai.
[]
mẫu chỉ có ý nghĩa trong một số trường hợp (ví dụ: PHP), nhưng không có nghĩa khác. Vì vậy, không "rõ ràng sai" - chỉ không được thực hiện để xử lý một trường hợp không chuẩn mà bạn có thể hoặc không cần phải xử lý.
Tôi đã viết một giải pháp đơn giản và thanh lịch hơn.
var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];
[0-9]
cho\d
Một cách siêu đơn giản bằng URLSearchParams .
function getParam(param){
return new URLSearchParams(window.location.search).get(param);
}
Nó hiện được hỗ trợ trong Chrome, Firefox, Safari, Edge và các ứng dụng khác .
Đây là một giải pháp đệ quy không có biểu thức chính quy và có đột biến tối thiểu (chỉ đối tượng params bị đột biến, điều mà tôi tin là không thể tránh khỏi trong JS).
Thật tuyệt vời vì nó:
Mã số:
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'];
Tôi đã thực hiện một chức năng làm điều này:
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;
};
Cập nhật ngày 26/5/2017, đây là một triển khai ES7 (chạy với giai đoạn cài sẵn babel 0, 1, 2 hoặc 3):
const getUrlParams = url => `${url}?`.split('?')[1]
.split('&').reduce((params, pair) =>
((key, val) => key ? {...params, [key]: val} : params)
(...`${pair}=`.split('=').map(decodeURIComponent)), {});
Một số xét nghiệm:
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 {}
Cập nhật 26/03/2018, đây là bản triển khai Bản đánh máy:
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
},
{}
)
Cập nhật 2/13/2019, đây là bản triển khai TypeScript được cập nhật hoạt động với 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, {})
Object {"": ""}
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";
}
}
Giải pháp ECMAScript 6:
var params = window.location.search
.substring(1)
.split("&")
.map(v => v.split("="))
.reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())
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())
}
tôi sử dụng
function getVal(str) {
var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
return v ? v[1] : null;
}
window.location.search
sẽ không bao gồm băm như thế nào #id
.
location.href
để khớp với kết quả thay vì location.search
. Cảm ơn bạn.
Tôi sử dụng thư viện parseUri . Nó cho phép bạn làm chính xác những gì bạn đang yêu cầu:
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'
Đây là giải pháp của tôi. Theo lời khuyên của Andy E trong khi trả lời câu hỏi này , sẽ không tốt cho hiệu suất của tập lệnh của bạn nếu nó liên tục xây dựng các chuỗi regex khác nhau, chạy các vòng lặp, v.v. chỉ để có được một giá trị duy nhất. Vì vậy, tôi đã đưa ra một tập lệnh đơn giản hơn trả về tất cả các tham số GET trong một đối tượng. Bạn nên gọi nó chỉ một lần, gán kết quả cho một biến và sau đó, tại bất kỳ thời điểm nào trong tương lai, nhận bất kỳ giá trị nào bạn muốn từ biến đó bằng khóa thích hợp. Lưu ý rằng nó cũng đảm nhiệm việc giải mã URI (nghĩa là những thứ như% 20) và thay thế + bằng một khoảng trắng:
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;
}
Vì vậy, đây là một vài thử nghiệm của kịch bản để bạn xem:
// 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".
Hoặc nếu bạn không muốn phát minh lại việc sử dụng bánh xe phân tích cú pháp URI URI.js
Để lấy giá trị của một tham số có tên foo:
new URI((''+document.location)).search(true).foo
Những gì nó làm là
Đây là một câu đố cho việc này .... http://jsfiddle.net/m6tett01/12/
Đối với Giá trị tham số đơn như chỉ số này.html? Spy = 1 sử dụng mã sau đây,
$(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];
}
Đối với tất cả giá trị tham số sử dụng mã sau,
$(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
}
}
Ở đây tôi đang đăng một ví dụ. Nhưng đó là trong jQuery. Hy vọng nó sẽ giúp người khác:
<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>
Con đường ngắn nhất:
new URL(location.href).searchParams.get("my_key");
new URL(location.href).searchParams.get("my_key")
hơn URLSearchParams
vì cái sau sẽ thất bại khi truy xuất tham số truy vấn đầu tiên của bất kỳ URL nào.
Câu hỏi này có quá nhiều câu trả lời, vì vậy tôi đang thêm một câu hỏi khác.
/**
* 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];
}, []);
}
sử dụng:
getURIParameter("id") // returns the last id or null if not present
getURIParameter("id", true) // returns an array of all ids
điều này đối phó với các tham số trống (các khóa hiện diện mà không có "=value"
), phơi bày cả API truy xuất giá trị vô hướng và mảng, cũng như giải mã thành phần URI thích hợp.
replace()
phương pháp:Từ urlStr
chuỗi:
paramVal = urlStr.replace(/.*param_name=([^&]*).*|(.*)/, '$1');
hoặc từ URL hiện tại :
paramVal = document.URL.replace(/.*param_name=([^&]*).*|(.*)/, '$1');
Giải trình:
document.URL
- giao diện trả về vị trí tài liệu (url trang) dưới dạng chuỗi.replace()
- phương thức trả về một chuỗi mới với một số hoặc tất cả các kết quả khớp của mẫu được thay thế bằng một thay thế ./.*param_name=([^&]*).*/
- mẫu biểu thức chính quy được bao quanh giữa các dấu gạch chéo có nghĩa là:
.*
- không hoặc nhiều hơn bất kỳ ký tự nào,param_name=
- tên param được serched,()
- nhóm trong biểu thức chính quy,[^&]*
- một hoặc nhiều ký tự không bao gồm &
,|
- luân phiên,$1
- tham chiếu đến nhóm đầu tiên trong biểu thức chính quy.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}'`);
Một đề nghị khác.
Đã có một số câu trả lời hay, nhưng tôi thấy chúng không phức tạp và khó hiểu. Đây là ngắn, đơn giản và trả về một mảng kết hợp đơn giản với các tên khóa tương ứng với các tên mã thông báo trong URL.
Tôi đã thêm một phiên bản với ý kiến dưới đây cho những người muốn tìm hiểu.
Lưu ý điều này phụ thuộc vào jQuery ($ .each) cho vòng lặp của nó, mà tôi khuyên dùng thay vì forEach. Tôi thấy đơn giản hơn để đảm bảo khả năng tương thích trình duyệt chéo bằng cách sử dụng jQuery trên bảng thay vì cắm các bản sửa lỗi riêng lẻ để hỗ trợ bất kỳ chức năng mới nào không được hỗ trợ trong các trình duyệt cũ hơn.
Chỉnh sửa: Sau khi tôi viết bài này, tôi nhận thấy câu trả lời của Eric Elliott, gần như giống nhau, mặc dù nó sử dụng forEach, trong khi tôi thường chống lại (vì những lý do đã nêu ở trên).
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;
}
Phiên bản đã bình luận:
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
}
Đối với các ví dụ dưới đây, chúng tôi sẽ giả sử địa chỉ này:
http://www.example.com/page.htm?id=4&name=murray
Bạn có thể gán mã thông báo URL cho biến của riêng mình:
var tokens = getTokens();
Sau đó tham khảo từng mã thông báo URL theo tên như thế này:
document.write( tokens['id'] );
Điều này sẽ in "4".
Bạn cũng có thể chỉ cần tham khảo trực tiếp tên aa từ chức năng:
document.write( getTokens()['name'] );
... sẽ in "thông điệp".
// 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"];
Có từ đây: http://jquery-howto.blogspot.ru/2009/09/get-url-parameter-values-with-jquery.html
Cách đơn giản
function getParams(url){
var regex = /[?&]([^=#]+)=([^&#]*)/g,
params = {},
match;
while(match = regex.exec(url)) {
params[match[1]] = match[2];
}
return params;
}
sau đó gọi nó như getParams (url)
Tôi có nhu cầu đọc biến URL GET và hoàn thành một hành động dựa trên tham số url. Tôi đã tìm kiếm cao và thấp để tìm giải pháp và tìm thấy đoạn mã nhỏ này. Về cơ bản, nó đọc url trang hiện tại, thực hiện một số biểu thức thông thường trên URL sau đó lưu các tham số url trong một mảng kết hợp mà chúng ta có thể dễ dàng truy cập.
Vì vậy, như một ví dụ nếu chúng ta có url sau với javascript ở dưới cùng.
http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July
Tất cả những gì chúng ta cần làm để có được các tham số id và trang là gọi đây:
Mã sẽ là:
<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>
// http:localhost:8080/path?param_1=a¶m_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"
Gist này của Eldon McGuinness cho đến nay là triển khai đầy đủ nhất của trình phân tích cú pháp chuỗi truy vấn JavaScript mà tôi đã thấy cho đến nay.
Thật không may, nó được viết dưới dạng plugin jQuery.
Tôi viết lại nó cho vanilla JS và thực hiện một vài cải tiến:
function parseQuery(str) {
var qso = {};
var qs = (str || document.location.search);
// Check for an empty querystring
if (qs == "") {
return qso;
}
// Normalize the querystring
qs = qs.replace(/(^\?)/, '').replace(/;/g, '&');
while (qs.indexOf("&&") != -1) {
qs = qs.replace(/&&/g, '&');
}
qs = qs.replace(/([\&]+$)/, '');
// Break the querystring into parts
qs = qs.split("&");
// Build the querystring object
for (var i = 0; i < qs.length; i++) {
var qi = qs[i].split("=");
qi = qi.map(function(n) {
return decodeURIComponent(n)
});
if (typeof qi[1] === "undefined") {
qi[1] = null;
}
if (typeof qso[qi[0]] !== "undefined") {
// If a key already exists then make this an object
if (typeof (qso[qi[0]]) == "string") {
var temp = qso[qi[0]];
if (qi[1] == "") {
qi[1] = null;
}
qso[qi[0]] = [];
qso[qi[0]].push(temp);
qso[qi[0]].push(qi[1]);
} else if (typeof (qso[qi[0]]) == "object") {
if (qi[1] == "") {
qi[1] = null;
}
qso[qi[0]].push(qi[1]);
}
} else {
// If no key exists just set it as a string
if (qi[1] == "") {
qi[1] = null;
}
qso[qi[0]] = qi[1];
}
}
return qso;
}
// DEMO
console.log(parseQuery("?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab"));
Xem thêm Fiddle này .
Thanh lịch, giải pháp phong cách chức năng
Hãy tạo một đối tượng chứa tên param param làm khóa, sau đó chúng ta có thể dễ dàng trích xuất tham số theo tên của nó:
// 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;
Đây là những gì tôi làm:
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;
}