Bagaimana cara mendapatkan nilai dari parameter GET?

1328

Saya memiliki URL dengan beberapa parameter GET sebagai berikut:

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

Saya perlu mendapatkan seluruh nilai c. Saya mencoba membaca URL, tetapi saya hanya mendapatkannya m2. Bagaimana saya melakukan ini menggunakan JavaScript?

joe
sumber
Sebelum Anda memposting jawaban baru, pertimbangkan sudah ada 50+ jawaban untuk pertanyaan ini. Harap pastikan bahwa jawaban Anda menyumbangkan informasi yang tidak ada di antara jawaban yang ada.
janniks

Jawaban:

2000

JavaScript sendiri tidak memiliki bawaan untuk menangani parameter string kueri.

Kode yang berjalan di browser (modern) Anda dapat menggunakan URLobjek (yang merupakan bagian dari API yang disediakan oleh browser ke 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);


Untuk browser yang lebih lama (termasuk Internet Explorer), Anda dapat menggunakan polyfill ini atau kode dari versi asli dari jawaban ini yang ada sebelum URL:

Anda dapat mengakses location.search, yang akan memberi Anda dari ?karakter ke akhir URL atau awal pengidentifikasi fragmen (#foo), mana yang lebih dulu.

Maka Anda dapat menguraikannya dengan ini:

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

Anda bisa mendapatkan string kueri dari URL halaman saat ini dengan:

var query = window.location.search.substring(1);
var qs = parse_query_string(query);
Quentin
sumber
Untuk peramban yang lebih lama, Anda mungkin memerlukan polyfill sebagaiURL tambahan untuk peramban URLSearchParams. Atau Anda dapat menghindari masalah ini dengan mengganti baris var c = url.searchParams.get("c");pada jawaban di atas dengan var c = new URLSearchParams(window.location.search).get("c");.
evanrmurphy
parse_query_string akan gagal untuk nilai-nilai yang mengandung '=', seperti ketika melewati nilai base64 yang dikodekan sebagai nilai. Versi yang menggunakan expresi reguler di bawah ini berfungsi lebih baik.
Manel Clos
7
@Jamland - Sama sekali tidak melakukan itu. Itu akan merusak segalanya. Berikut adalah demo langsung yang new URL() mengharapkan untuk menerima URL yang disandikan dengan benar sebagai argumennya. decodeURIComponentmengharapkan untuk lulus komponen URL, bukan keseluruhan URL.
Quentin
@ Quentin Saya sudah memeriksa karakter khusus yang berbeda dan saya melihat Anda benar. decodeURIComponenttidak boleh digunakan dalam kasus ini
Jamland 6-18
1
The parse_query_stringfungsi melakukan double-decode dari value. Yang =dikeluarkan disebutkan oleh @ManelClos dapat diatasi dengan menambahkan parameter kedua 2( limit) ke vars[i].split().
Jake
242

Sebagian besar implementasi yang saya lihat kehilangan URL-decoding nama dan nilai.

Berikut adalah fungsi utilitas umum yang juga melakukan decoding URL yang benar:

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);
Makan Goral
sumber
3
Kode ini tidak berfungsi. Itu menciptakan infinite loop karena regex dikompilasi dalam definisi loop yang me-reset indeks saat ini. Ini berfungsi dengan baik jika Anda menempatkan regex ke dalam variabel di luar loop.
maxhawkins
2
@ Maxhawkins: Ini berfungsi di beberapa browser sementara itu akan masuk ke loop tak terbatas di yang lain. Anda setengah benar dalam hal itu. Saya akan memperbaiki kode menjadi cross-browser. Terima kasih telah menunjukkan itu!
Ates Goral
3
@ZiTAL Fungsi ini digunakan dengan bagian permintaan dari URL, bukan keseluruhan URL. Lihat contoh penggunaan yang dikomentari di bawah ini.
Ates Goral
1
Ketidaksensitifan Kasus Harvey @ bukanlah masalah parameter kueri. Kedengarannya seperti hal khusus aplikasi yang harus diterapkan bersama, atau di atas ekstraksi parameter kueri.
Ates Goral
7
Kenapa qs.split('+').join(' ');dan tidak qs.replace(/\+/g, ' ');?
FlameStorm
234

sumber

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')
Haim Evgi
sumber
8
Saya paling suka opsi ini, tetapi lebih suka mengembalikan nol, atau hasilnya, tetapi bukan string kosong.
Jason Thrasher
1
Sepertinya Anda memiliki beberapa karakter tambahan. "\\[" seharusnya "\[". Karena itu adalah string reguler, [dan] tidak perlu diloloskan.
EricP
Ini bukan case sensitive. Di mana saya akan menambahkan "i" untuk membuatnya tidak sensitif huruf?
zeta
alert (gup ('UserID', window.location.href));
Arun Prasad ES
6
@mottie dead link
invot
202

Ini adalah cara mudah untuk memeriksa hanya satu parameter:

URL contoh:

    http://myserver/action?myParam=2

Contoh Javascript:

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

jika "myParam" ada di URL ... variabel myParam akan berisi "2", jika tidak maka itu tidak akan ditentukan.

Mungkin Anda menginginkan nilai default, dalam hal ini:

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

Pembaruan: Ini berfungsi lebih baik:

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

Dan itu berfungsi dengan baik bahkan ketika URL penuh dengan parameter.

mzalazar
sumber
36
Ini hanya berfungsi jika parameter yang Anda ambil adalah yang terakhir di URL, yang tidak harus Anda andalkan (bahkan jika Anda hanya mengharapkan satu parameter). misalnya http://myserver/action?myParam=2&anotherParam=3akan menghasilkan "2"tetapi "2&anotherParam=3".
Glacial
39
(location.search.split('myParam=')[1]||'').split('&')[0]- untuk digunakan dengan beberapa param atau mungkin tidak ada myParam .
Gábor Imre
ataulocation.search.split('myParam=').splice(1).join('').split('&')[0]
J.Steve
1
Anda bisa mendapatkan lebih banyak presisi dan memungkinkan urutan parameter apa pun dengan memprioritaskannya [?|&]seperti dalam[?|&]myParam=([^&]+)
1,21 gigawatt
1
Anda mungkin perlu mendekodekan nilairesult = decodeURIComponent(result);
1,21 gigawatt
126

Vendor browser telah menerapkan cara asli untuk melakukan ini melalui URL dan 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"

Saat ini didukung di Firefox, Opera, Safari, Chrome dan Edge. Untuk daftar dukungan browser lihat di sini .

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, seorang insinyur di Google, merekomendasikan untuk menggunakan polyfill ini untuk browser yang tidak didukung.

cgatian
sumber
Menurut tautan MDN, URL dukungan Safari tetapi tidak URLSearchParams.
Mark Thomson
3
@ Markus Bukankah polyfill menangani itu? BTW, Safari adalah hari modern 'IE6
Csaba Toth
Kenapa new URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')kembali nulluntukku? (Di Chrome stabil). bdan csepertinya bekerja dengan baik.
ripper234
Jawaban yang diperbarui. Jawaban asli saya tidak benar menggunakan URLSearchParams, karena hanya dirancang untuk bekerja dengan bagian querystring dari URL.
cgatian
1
Gunakan url.searchParamssebagai gantinya new URLSearchParams(url.search).
Caio Tarifa
86

Saya menemukan ini berabad-abad yang lalu, sangat mudah:

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

Kemudian panggil seperti ini:

var fType = getUrlVars()["type"];
VaMoose
sumber
7
+1 solusi hebat - elegan, efisien dan cerdas adalah ketentuan penggunaan. Untuk tujuan saya lebih baik daripada solusi yang diterima lainnya
Elemental
pendek + sederhana + kuat = hebat
mzy
1
Sangat bagus, ini juga berfungsi menggunakan location.search bukan window.location.href
Fabio C.
1
@ pdxbmw Tidak ada gunanya dan harus dihapus. Sekilas, kode ini mungkin tampak pintar, tetapi tidak dipikirkan dengan baik. Perbaikan: Gunakan decodeURIComponent()nilai, karena itulah yang biasanya ingin Anda kerjakan; gunakan window.location.searchalih-alih window.location.href, karena Anda hanya tertarik pada parameter, bukan keseluruhan url.
Leif,
2
Saran @Leif bekerja dengan baik. Saya mendapatkan ID 142 # karena pada akhir URL adalah # yang dihasilkan pada klik tombol. Meninggalkan fungsi seperti inivar vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
Andres Ramos
77

Anda bisa mendapatkan string kueri location.search, lalu Anda bisa membagi semuanya setelah tanda tanya:

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;
Blixt
sumber
3
Bagaimana dengan URL-decoding nama dan nilai parameter?
Ates Goral
Pendekatan ini tidak menangani array. Misalnya ?array[]=1&array[]=2menghasilkan {"array[]": "2"}, yang jelas salah.
Kafoso
@ Kafoso Tidak ada yang benar atau salah di sini. Pertama-tama, bidang berulang dengan nama yang sama tidak memiliki perilaku standar yang ditentukan, dan terserah parser untuk menangani. Selain itu, []pola hanya memiliki arti dalam beberapa kasus (misalnya, PHP), tetapi tidak yang lain. Jadi bukan "jelas salah" - hanya saja tidak diterapkan untuk menangani kasus non-standar yang Anda mungkin perlu atau mungkin tidak perlu ditangani.
Blixt
38

Saya menulis solusi yang lebih sederhana dan elegan.

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];
Natus Drew
sumber
Lihat itu, dua baris, melakukan persis seperti yang tertulis di kaleng - dan tidak akan pecah jika seseorang mencoba menyelidiki kerentanan dan menambahkan banyak karakter tambahan dan pertanyaan tidak seperti beberapa solusi ini. Cheers chap!
David G
Ini melakukan pekerjaan dengan benar dan hanya dalam 2 baris. Jawaban bagus!
Andres Ramos
Saya pikir ini akan berguna untuk cek kosong lainnya. Jika tidak, contohnya ada di sini: stackoverflow.com/a/36076822/1945948 (saya memiliki upaya edit yang ditolak).
atw
Tidak mengerti ... bagaimana ini menjawab pertanyaan, yaitu tentang mendapatkan params dari string tertentu, 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5'?
mike rodent
Senang jawaban ini, diberi +1. Hanya saran, Anda dapat mengganti [0-9] untuk\d
gmanjon
31

Cara super sederhana menggunakan URLSearchParams .

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

Saat ini didukung di Chrome, Firefox, Safari, Edge, dan lainnya .

spencer.sm
sumber
Dapatkan kesalahan: 'SCRIPT5009:' URLSearchParams 'tidak ditentukan' saat berjalan di Edge.
Andreas Presthammer
@AndreasPresthammer Apa versi edge?
spencer.sm
@ spencer-sm Microsoft Edge 41.16299.820.0
Andreas Presthammer
Tidak berfungsi dengan parameter URL prettified
ii iml0sto1
@ iiiml0sto1 Apa itu "parameter URL prettified"?
spencer.sm
30

Berikut ini adalah solusi rekursif yang tidak memiliki regex, dan memiliki mutasi minimal (hanya objek params yang dimutasi, yang saya percaya tidak dapat dihindari dalam JS).

Ini luar biasa karena:

  • Rekursif
  • Menangani beberapa parameter dengan nama yang sama
  • Berurusan dengan baik dengan string parameter cacat (nilai yang hilang, dll.
  • Tidak pecah jika '=' ada dalam nilai
  • Melakukan decoding URL
  • Dan terakhir, Ini luar biasa karena ... argh !!!

Kode:

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'];
Jai
sumber
31
Kamu ... kamu bilang rekursif dua kali.
Dissident Rage
Itu tidak dapat menemukan param pertama di url berikutnya: www.mysite.com?first=1&second=2
Mario Radomanana
Halo Mario, ini JSFiddle yang menunjukkan bahwa URL itu berfungsi dengan URL itu: jsfiddle.net/q6xfJ - Jika Anda menemukan kesalahan, apakah ini browser yang spesifik? Saat menguji, harap perhatikan bahwa jawaban yang saya berikan menggunakan location.search, yang merupakan bagian '? First = 1 & second = 2' dari URL. Cheers :)
Jai
45
Saya tidak melihat mengapa sesuatu itu baik hanya karena itu bersifat rekursif.
Adam Arold
6
Erm, saya pikir Anda melewatkan lelucon rekursi di sana, Adam. Meskipun sekarang semua orang akan melewatkannya karena edi9999 dihapus yang kedua "Apakah rekursif".
Jai
27

Saya membuat fungsi yang melakukan ini:

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

Pembaruan 5/26/2017, berikut adalah implementasi ES7 (berjalan dengan babel preset stage 0, 1, 2, atau 3):

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

Beberapa tes:

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

Pembaruan 3/26/2018, berikut ini adalah implementasi Script:

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

Pembaruan 2/13/2019, berikut ini adalah implementasi TypeScript yang diperbarui yang bekerja dengan 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, {})
Nate Ferrero
sumber
Pada URL tanpa parameter kueri, ini akan kembaliObject {"": ""}
Ilya Semenov
2
Terlihat cukup bersih untuk saya. Jawaban lainnya terlalu "ajaib" tanpa cukup penjelasan.
Levi Roberts
Ini jawaban yang luar biasa!
Spencer Bigum
Terima kasih @SpencerBigum!
Nate Ferrero
24

Lihat ini

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";
    }
}
Dhiral Pandya
sumber
1
Terima kasih. Saya baru mengenal jscript dan ini akan sangat membantu.
Brian B.
20

Solusi 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())
veiset
sumber
Bagus. FYI, karena ini adalah Peta, penggunaannya adalah params.get ("key");
evanmcd
Saya suka tapi mungkin itu tidak akan mendapatkan param pertama. Saya membuat fungsi berdasarkan pada contoh Anda 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
11

saya menggunakan

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}
Fancyoung
sumber
Silakan tambahkan beberapa penjelasan. Jawaban Anda saat ini ditandai "kualitas rendah" dan pada akhirnya mungkin dihapus tanpa.
Johannes Jander
Saya menemukan bahwa jika ada string seperti '#id' di akhir url, dan mengembalikan nilai parameter terakhir seperti 'somevalue # id'
Ayano
@Aano window.location.searchtidak akan menyertakan hash like #id.
Fancyoung
@ Fancyoung Ya, Anda benar, saya membuat kesalahan yang digunakan location.hrefuntuk mencocokkan hasilnya, bukan. location.searchTerima kasih.
Ayano
11

Saya menggunakan parseUri library. Ini memungkinkan Anda untuk melakukan persis apa yang Anda minta:

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'
Chris Dutrow
sumber
9

Ini solusinya. Seperti yang disarankan oleh Andy E saat menjawab pertanyaan ini , itu tidak baik untuk kinerja skrip Anda jika berulang kali membangun berbagai string regex, menjalankan loop dll hanya untuk mendapatkan nilai tunggal. Jadi, saya telah membuat skrip sederhana yang mengembalikan semua parameter GET dalam satu objek. Anda harus memanggilnya sekali saja, menetapkan hasilnya ke variabel dan kemudian, pada titik mana pun di masa depan, dapatkan nilai apa pun yang Anda inginkan dari variabel itu menggunakan kunci yang sesuai. Perhatikan bahwa ini juga menangani penguraian URI (mis. Hal-hal seperti% 20) dan menggantikan + dengan spasi:

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

Jadi, berikut adalah beberapa tes naskah untuk Anda lihat:

// 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".
Folusho Oladipo
sumber
.replace ("+", "") hanya akan menggantikan kejadian pertama yang harus Anda gunakan .replace (/ \ + / g, "");
Tony
8

Atau jika Anda tidak ingin menemukan kembali roda parsing URI gunakan URI.js

Untuk mendapatkan nilai parameter bernama foo:

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

Apa yang dilakukan adalah

  1. Konversi document.location ke string (ini adalah objek)
  2. Umpan string itu ke konstruktor kelas URI.Js
  3. Aktifkan fungsi search () untuk mendapatkan bagian search (query) dari url
    (lewat true memberitahu itu untuk menampilkan objek)
  4. Akses properti foo pada objek yang dihasilkan untuk mendapatkan nilai

Ini biola untuk ini .... http://jsfiddle.net/m6tett01/12/

Gus
sumber
8

Untuk Nilai Parameter Tunggal seperti ini index.html? Msg = 1 gunakan kode berikut,

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

}

Untuk Semua Nilai Parameter, gunakan Kode berikut,

$(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
    }
} 
Ravi Patel
sumber
1
Saya suka solusi ini!
alemur
8

Di sini saya memposting satu contoh. Tapi itu di jQuery. Semoga ini bisa membantu orang lain:

<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>
Sariban D'Cl
sumber
1
Disalin dari pos Anda yang lain: "Membutuhkan plugin url: plugins.jquery.com/url"
zeta
8

Cara terpendek:

new URL(location.href).searchParams.get("my_key");
Zon
sumber
2
Saya lebih suka menggunakan new URL(location.href).searchParams.get("my_key")lebih URLSearchParamskarena yang terakhir akan gagal ketika mengambil parameter kueri pertama dari URL apa pun.
Travis Clarke
1
Diuji kedua varian. Saya setuju dengan kamu. Diedit jawabannya.
Zon
7

pertanyaan ini memiliki terlalu banyak jawaban, jadi saya menambahkan yang lain.

/**
 * 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];
    }, []);
}

pemakaian:

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

ini mengatasi dengan parameter kosong (kunci-kunci itu ada tanpa "=value"), pemaparan API pengambilan nilai skalar dan berbasis array, serta decoding komponen URI yang tepat.

Tyson
sumber
7

Cara termudah menggunakan replace()metode ini:

Dari urlStrstring:

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

atau dari URL saat ini :

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

Penjelasan:

  • document.URL - antarmuka mengembalikan lokasi dokumen (url halaman) sebagai string.
  • replace()- Metode mengembalikan string baru dengan beberapa atau semua kecocokan pola diganti oleh pengganti .
  • /.*param_name=([^&]*).*/- pola ekspresi reguler terlampir di antara garis miring yang berarti:
    • .* - nol atau lebih dari karakter apa pun,
    • param_name= - Nama param yang disisipkan,
    • () - grup dalam ekspresi reguler,
    • [^&]*- satu atau lebih dari karakter apa pun kecuali &,
    • | - pergantian,
    • $1 - referensi ke grup pertama dalam ekspresi reguler.

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}'`);

simhumileco
sumber
1
Solusi yang bagus, tetapi jika parameter tidak ditemukan, seluruh string dikembalikan. Saya harapkan "tidak terdefinisi" dalam kasus ini.
pensan
1
Hai @pensan, terima kasih atas komentar Anda yang luar biasa. Saya hanya menambahkan ekspresi reguler penanganan situasi ketika parameter tidak muncul di URL. Dalam hal ini kita mendapatkan string emty (bukan string keseluruhan).
simhumileco
6

Namun saran lain.

Sudah ada beberapa jawaban bagus, tetapi saya mendapati mereka tidak perlu rumit dan sulit untuk dipahami. Ini pendek, sederhana, dan mengembalikan array asosiatif sederhana dengan nama kunci yang sesuai dengan nama token di URL.

Saya menambahkan versi dengan komentar di bawah ini untuk mereka yang ingin belajar.

Perhatikan ini bergantung pada jQuery ($ .each) untuk loop-nya, yang saya sarankan daripada forEach. Saya merasa lebih mudah untuk memastikan kompatibilitas lintas-browser menggunakan jQuery di seluruh papan daripada menghubungkan dalam perbaikan individu untuk mendukung mana saja fungsi baru yang tidak didukung di browser yang lebih lama.

Sunting: Setelah saya menulis ini, saya perhatikan jawaban Eric Elliott, yang hampir sama, meskipun menggunakan forEach, sementara saya umumnya menentang (untuk alasan yang disebutkan di atas).

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

Versi yang dikomentari:

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
}

Untuk contoh di bawah ini kami akan menganggap alamat ini:

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

Anda dapat menetapkan token URL ke variabel Anda sendiri:

var tokens = getTokens();

Kemudian lihat setiap token URL dengan nama seperti ini:

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

Ini akan mencetak "4".

Anda juga bisa langsung merujuk ke nama token dari fungsi secara langsung:

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

... yang akan mencetak "more".

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

Dapatkan dari sini: http://jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html

Tsar
sumber
6

Cara sederhana

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

lalu panggil saja seperti getParams (url)

Sudhakar Reddy
sumber
5

Saya harus membaca URL GET variabel dan menyelesaikan tindakan berdasarkan parameter url. Saya mencari-cari solusi tinggi dan menemukan sepotong kode ini. Ini pada dasarnya membaca url halaman saat ini, melakukan beberapa ekspresi reguler pada URL kemudian menyimpan parameter url dalam array asosiatif, yang dapat kita akses dengan mudah.

Jadi sebagai contoh jika kita memiliki url berikut dengan javascript di bagian bawah di tempat.

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

Yang perlu kita lakukan untuk mendapatkan parameter id dan halaman adalah memanggil ini:

Kode tersebut akan:

<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>
Waseem Khan
sumber
Bekerja untuk saya, terima kasih
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"     
Wolf7176
sumber
Ini mengembalikan parameter pertama dengan '?'
Pini Cheyni
5

Intisari dari Eldon McGuinness ini sejauh ini merupakan implementasi paling lengkap dari parser string kueri JavaScript yang telah saya lihat sejauh ini.

Sayangnya, ini ditulis sebagai plugin jQuery.

Saya menulis ulang untuk vanilla JS dan membuat beberapa peningkatan:

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

Lihat juga Fiddle ini .

John Slegers
sumber
Apa yang saya tidak mengerti tentang javascript adalah mengapa mereka belum membuat dan memasukkan fungsi url parsing ke dalam bahasa itu sendiri atau setidaknya di pustaka standar? Hal-hal tingkat rendah seperti ini seharusnya tidak diciptakan kembali berulang kali, atau diserahkan kepada pengembang untuk memanfaatkan solusi varian entropis apa pun yang akan mereka siapkan. Jika ini solid, maka sesuatu seperti ini harus dibuat menjadi perpustakaan standar. Ini adalah contoh dari jenis hal dalam javascript yang membuat saya tidak bisa bahasa.
ahnbizcad
5

Elegan, solusi gaya fungsional

Mari kita membuat objek yang berisi nama-nama param URL sebagai kunci, maka kita dapat dengan mudah mengekstrak parameter dengan namanya:

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

sumber
Saya suka ini, tetapi tidak berhasil untuk saya tanpa memastikan untuk mengembalikan akumulator dalam fungsi pengurangan
Ella
@ Ela itu salah ketik, tidak ada cara itu bisa bekerja tanpareturn
Terlihat lebih baik sekarang, semoga Anda berhasil sampai ke halaman pertama!
Ella
4

Inilah yang saya lakukan:

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;
}
Bobb Fwed
sumber