Làm thế nào để có được giá trị từ các tham số GET?


1327

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?


Trước khi bạn đăng câu trả lời mới, hãy xem xét đã có hơn 50 câu trả lời cho câu hỏi này. Xin vui lòng, đảm bảo rằng câu trả lời của bạn đóng góp thông tin không nằm trong số các câu trả lời hiện có.
janniks

Câu trả lời:


1998

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);

Đối với các trình duyệt cũ hơn, bạn có thể cần một polyfill ngoàiURL 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");.
evanrmurphy

parse_query_opes sẽ thất bại đối với các giá trị có chứa '=', như khi chuyển một giá trị được mã hóa base64 làm giá trị. Phiên bản sử dụng expresion thường xuyên dưới đây hoạt động tốt hơn.
Manel Clos

7
@Jamland - Tuyệt đối không làm điều đó. Nó sẽ phá vỡ mọi thứ. Dưới đây là bản demo trực tiếp 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ó. decodeURIComponenthy 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.
Quentin

@Quentin Tôi đã kiểm tra các ký tự đặc biệt khác nhau và tôi thấy bạn đúng. decodeURIComponentkhông nên được sử dụng trong trường hợp này
Jamland 6/12/18

1
Các parse_query_stringhà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().
Jake

242

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);

3
Mã này không hoạt động. Nó tạo ra một vòng lặp vô hạn vì regex được biên dịch theo định nghĩa vòng lặp đặt lại chỉ mục hiện tại. Nó hoạt động đúng nếu bạn đặt regex vào một biến bên ngoài vòng lặp.
maxhawkins

2
@maxhawkins: Nó hoạt động trong một số trình duyệt trong khi nó sẽ đi vào một vòng lặp vô hạn ở những trình duyệt khác. Bạn đúng một nửa về vấn đề đó. Tôi sẽ sửa mã để được trình duyệt chéo. Cảm ơn đã chỉ ra rằng!
Ates Goral

3
@ZiTAL Chức năng này được sử dụng với phần truy vấn của URL, không phải toàn bộ URL. Xem ví dụ sử dụng nhận xét bên dưới.
Ates Goral 17/212

1
@Harvey Trường hợp không nhạy cảm không phải là mối quan tâm của các tham số truy vấn. Nghe có vẻ như là một thứ dành riêng cho ứng dụng nên được áp dụng cùng với hoặc trên đầu trích xuất tham số truy vấn.
Ates Goral

7
Tại sao qs.split('+').join(' ');và không qs.replace(/\+/g, ' ');?
FlameStorm

234

nguồn

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')

8
Tôi thích tùy chọn này nhất, nhưng thích trả về null hoặc kết quả, nhưng không phải là một chuỗi rỗng.
Jason Thrasher

1
Có vẻ như bạn có một số ký tự thoát thêm. "\\[" nên là "\[". Vì đó là các chuỗi thông thường, [và] không cần phải thoát.
EricP

Đây không phải là trường hợp không nhạy cảm. Tôi sẽ thêm "i" vào đâu để làm cho trường hợp không nhạy cảm?
zeta

cảnh báo (gup ('UserID', window.location.href));
Arun Prasad ES

6
@mottie liên kết chết
invot

202

Đâ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ố.


36
Điều này chỉ hoạt động nếu tham số bạn đang lấy là tham số cuối cùng trong URL, mà bạn không nên phụ thuộc vào (ngay cả khi bạn chỉ mong đợi một tham số). ví dụ http://myserver/action?myParam=2&anotherParam=3sẽ không mang lại "2"nhưng "2&anotherParam=3".
Glacials

39
(location.search.split('myParam=')[1]||'').split('&')[0]- để sử dụng với nhiều param hoặc thiếu possibliy myParam .
Gábor Imre

hoặclocation.search.split('myParam=').splice(1).join('').split('&')[0]
J.Steve

1
Bạn có thể đạt được độ chính xác cao hơn và cho phép bất kỳ thứ tự tham số nào bằng cách đăng ký trước [?|&]như trong[?|&]myParam=([^&]+)
1,21 gigawatt

1
Bạn có thể cần giải mã giá trịresult = decodeURIComponent(result);
1,21 gigawatt

126

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

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

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ợ.


Theo URL hỗ trợ Safari của liên kết MDN nhưng không phải URLSearchParams.
Mark Thomson

3
@Markodar Không phải là polyfill chăm sóc điều đó sao? BTW, Safari là thời hiện đại 'IE6
Csaba Toth

Tại sao new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')lại trở về nullvới tôi? (Trên Chrome ổn định). bcdường như hoạt động tốt.
ripper234 ngày

Cập nhật câu trả lời. Câu trả lời ban đầu của tôi không đúng khi sử dụng URLSearchParams, vì nó chỉ được thiết kế để hoạt động với phần chuỗi truy vấn của URL.
cgatian

1
Sử dụng url.searchParamsthay thế new URLSearchParams(url.search).
Caio Tarifa

86

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"];

7
Giải pháp tuyệt vời +1 - thanh lịch, hiệu quả và thông minh là điều khoản sử dụng. Đối với mục đích của tôi tốt hơn so với giải pháp được chấp nhận khác
tố

ngắn + đơn giản + mạnh mẽ = tuyệt vời
mzy

1
Rất hay, nó cũng hoạt động bằng cách sử dụng location.search thay vì window.location.href
Fabio C.

1
@pdxbmw Nó là vô dụng và nên được loại bỏ. Mã có vẻ thông minh thoạt nhìn, nhưng không được suy nghĩ kỹ. Cải tiến: Sử dụng 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.searchthay vì window.location.href, vì bạn chỉ quan tâm đến các tham số, không phải toàn bộ url.
Leif

2
@Leif đề nghị làm việc tuyệt vời. Tôi đã nhận được ID 142 # vì ở cuối URL là # được tạo trên một lần nhấp vào nút. Rời khỏi chức năng như thế nàyvar vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Andres Ramos

77

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;

3
Điều gì về giải mã URL các tên và giá trị tham số?
Ates Goral

Cách tiếp cận này không xử lý mảng. Ví dụ ?array[]=1&array[]=2sản xuất {"array[]": "2"}, đó là rõ ràng sai.
Kafoso

@Kafoso Không có rõ ràng đúng hay sai ở đây. Trước hết, các trường lặp lại có cùng tên không có hành vi tiêu chuẩn cụ thể và tùy thuộc vào trình phân tích cú pháp để xử lý. Ngoài ra, []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ý.
Blixt

38

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];

Nhìn vào đó, hai dòng, thực hiện chính xác những gì nó nói trên hộp thiếc - và sẽ không bị phá vỡ nếu ai đó đang cố gắng thăm dò các lỗ hổng và thêm một loạt các ký tự và truy vấn bổ sung không giống như một vài giải pháp này. Chúc mừng chap!
David G

Điều này làm công việc đúng và chỉ trong 2 dòng. Câu trả lời chính xác!
Andres Ramos

Tôi nghĩ rằng nó sẽ có ích cho việc kiểm tra null được bao gồm. Nếu không, một ví dụ ở đây: stackoverflow.com/a/36076822/1945948 (Tôi đã cố gắng chỉnh sửa từ chối).
vào

Không hiểu ... làm thế nào để trả lời câu hỏi này, đó là về việc lấy thông số từ một chuỗi cụ thể, 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5'?
mike gặm nhấm

Yêu câu trả lời này, + 1'ed. Chỉ cần một gợi ý, bạn có thể thay thế [0-9] cho\d
gmanjon

31

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 .


Nhận lỗi: 'SCRIPT5009:' URLSearchParams 'không được xác định' khi chạy trong Edge.
Andreas Presthammer

@AndreasPresthammer Phiên bản nào của cạnh?
spencer.sm

@ spencer-sm Microsoft Edge 41.16299.820.0
Andreas Presthammer

Không hoạt động với các tham số URL được chỉ định
ii iml0sto1

@ iiiml0sto1 "Tham số URL được chỉnh sửa" là gì?
spencer.sm

30

Đâ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ó:

  • Là đệ quy
  • Xử lý nhiều tham số cùng tên
  • Giao dịch tốt với các chuỗi tham số không đúng định dạng (thiếu giá trị, v.v.)
  • Không phá vỡ nếu '=' nằm trong giá trị
  • Thực hiện giải mã URL
  • Và cuối cùng, thật tuyệt vời vì nó ... argh !!!

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'];

31
Bạn ... bạn đã nói đệ quy hai lần.
Cơn thịnh nộ bất đồng

Không thể tìm thấy thông số đầu tiên trong url tiếp theo: www.mysite.com?first=1&second=2
Mario Radomanana

Xin chào Mario, đây là một JSFiddle cho thấy nó hoạt động với URL đó: jsfiddle.net/q6xfJ - Nếu bạn đã tìm thấy một lỗi, điều này có lẽ là trình duyệt cụ thể? Khi kiểm tra, xin lưu ý rằng câu trả lời tôi cung cấp sử dụng location.search, đó là phần '? First = 1 & second = 2' của URL. Chúc mừng :)
Jai

45
Tôi không thấy lý do tại sao một cái gì đó tốt chỉ vì nó là đệ quy.
Adam Arold 7/2/2015

6
Erm, tôi nghĩ rằng bạn đã bỏ lỡ trò đùa đệ quy ở đó Adam. Mặc dù bây giờ mọi người sẽ bỏ lỡ nó vì edi9999 đã loại bỏ "đệ quy" thứ hai.
Jai

27

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, {})

Trên một URL không có tham số truy vấn, điều này sẽ trở lạiObject {"": ""}
Ilya Semenov

2
Có vẻ đủ sạch với tôi. Phần còn lại của câu trả lời chỉ là quá nhiều "ma thuật" mà không có đủ lời giải thích.
Levi Roberts

Đây là một câu trả lời tuyệt vời!
Spencer Bigum

Cảm ơn @SpencerBigum!
Nate Ferrero

24

Xem cái này

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";
    }
}

1
Cảm ơn. Tôi mới sử dụng jscript và điều này sẽ khá hữu ích.
Brian B.

20

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())

Đẹp. FYI, vì đó là Bản đồ, việc sử dụng là params.get ("khóa");
evanmcd

Tôi thích nó nhưng có lẽ nó sẽ không nhận được thông số đầu tiên. Tôi đã tạo một hàm dựa trên ví dụ của bạn 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()) }
mah.cr 16/12/19

11

tôi sử dụng

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

Vui lòng thêm một số lời giải thích. Câu trả lời của bạn hiện được gắn cờ "chất lượng thấp" và cuối cùng có thể bị xóa mà không có.
Julian Jander 18/03/2016

Tôi thấy rằng nếu có một chuỗi như '#id' ở cuối url và trả về giá trị tham số cuối cùng như 'somevalue # id'
Ayano

@Ayano window.location.searchsẽ không bao gồm băm như thế nào #id.
Fancyoung

@Fancyoung Vâng, bạn nói đúng, tôi đã mắc lỗi sử dụng location.hrefđể khớp với kết quả thay vì location.search. Cảm ơn bạn.
Ayano

11

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'

9

Đâ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".

.replace ("+", "") sẽ chỉ thay thế lần xuất hiện đầu tiên Bạn cần sử dụng .replace (/ \ + / g, "");
Tony

8

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à

  1. Chuyển đổi document.location thành một chuỗi (nó là một đối tượng)
  2. Cung cấp chuỗi đó cho trình kết hợp lớp URI của URI.js
  3. Gọi hàm search () để lấy phần tìm kiếm (truy vấn) của url
    (truyền true sẽ cho nó xuất ra một đối tượng)
  4. Truy cập thuộc tính foo trên đối tượng kết quả để nhận giá trị

Đây là một câu đố cho việc này .... http://jsfiddle.net/m6tett01/12/


8

Đố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
    }
} 

1
Tôi thích giải pháp này!
alemur

8

Ở đâ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>

1
Sao chép từ bài đăng khác của bạn: "Yêu cầu plugin url: plugins.jquery.com/url"
zeta

8

Con đường ngắn nhất:

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

2
Tôi sẽ ưu tiên sử dụng new URL(location.href).searchParams.get("my_key")hơn URLSearchParamsvì 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.
Travis Clarke

1
Đã thử nghiệm cả hai biến thể. Tôi đồng ý với bạn. Chỉnh sửa câu trả lời.
Zon

7

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.


7

Cách dễ nhất để sử dụng replace()phương pháp:

Từ urlStrchuỗ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}'`);


1
Giải pháp hay, nhưng nếu không tìm thấy tham số, toàn bộ chuỗi được trả về. Tôi sẽ mong đợi "không xác định" trong trường hợp này.
penan

1
Xin chào @pensan, cảm ơn bạn đã nhận xét tuyệt vời của bạn. Tôi chỉ thêm vào biểu thức chính quy xử lý tình huống khi tham số không xuất hiện trong URL. Trong trường hợp này, chúng tôi nhận được chuỗi emty (không phải toàn bộ chuỗi).
simhumileco

6

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".


6
// 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


6

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)


5

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>

Làm việc cho tôi cảm ơn
OJB1

5
// 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"     

Điều này trả về tham số đầu tiên với '?'
Pini Cheyni

5

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 .


Điều tôi không hiểu về javascript là tại sao họ chưa thực hiện và đặt các chức năng phân tích cú pháp url vào ngôn ngữ hoặc ít nhất là trong thư viện chuẩn? công cụ cấp thấp ilke điều này không nên được phát minh lại nhiều lần, cũng không nên để các nhà phát triển sử dụng bất kỳ giải pháp biến thể ngẫu nhiên nào mà họ sẽ sử dụng. Nếu điều này là vững chắc, thì một cái gì đó như thế này nên được đưa vào thư viện tiêu chuẩn. Đây là một ví dụ về loại điều trong javascript khiến tôi tắt ngôn ngữ.
ahnbizcad

5

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;

thích điều này, nhưng đã không làm việc cho tôi mà không đảm bảo trả lại bộ tích lũy trong chức năng rút
gọn

@Ella đó là một lỗi đánh máy, không có cách nào nó có thể hoạt động mà không córeturn

Bây giờ có vẻ tốt hơn, hãy hy vọng bạn vào trang đầu tiên!
Ella

4

Đâ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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.