2012-01-17 15 views
47

ho per esempio, il seguente URL memorizzato in una variabile globale:Costruire un URL con parametri utilizzando jQuery

var myUrl = "http://mydomain.com/something?row=1"; 

Poi una funzione deve aggiungere diciamo un altro parametro chiamato "colonna". In che modo questa funzione aggiungerebbe parametri a una stringa di URL preesistente usando jQuery?

Esempio di stringa generata previsto:

"http://mydomain.com/something?row=1&column=9" 

Il problema è che myUrl potrebbe anche essere semplicemente:

var myUrl = "http://mydomain.com/something"; 

(Si noti che non ci sono pre-esistenti parametri)

+0

Per cosa ti serve? –

+0

C'è un componente che ha bisogno di quell'URL e ha il proprio modo di recuperare i dati usando AJAX. –

risposta

45

Controlla la funzione jQuery .param(), che dovrebbe fare il trucco.

http://api.jquery.com/jQuery.param/

È quindi possibile solo creare una funzione che aggiunge la stringa generata dal .param() a un URL.

+15

Cosa succede se la stringa ha già parametri? O la stringa ha già parametri con lo stesso nome? – ioquatix

+1

In questo caso, la cosa migliore è probabilmente analizzare in anticipo l'URL, quindi ricostruirlo in seguito con jQuery.param o simile. "La stringa è una struttura di dati scuri ..." – johncip

20

Non hai bisogno di jQuery, utilizzare una funzione come questa:

var buildUrl = function(base, key, value) { 
    var sep = (base.indexOf('?') > -1) ? '&' : '?'; 
    return base + sep + key + '=' + value; 
} 

si può usare in questo modo:

buildUrl('http://www.example.com/foo', 'test', '123'); 
buildUrl('http://www.example.com/foo?bar=baz', 'test', '123'); 
+0

Questo non tiene conto del fatto che il parametro potrebbe già esistere. Sarebbe ovvio quando lo si invoca come si fa negli esempi, ma non sarebbe ovvio quando si aggiungono parametri all'URL quando tutti i parametri provengono da altre variabili. –

+3

Manca la codifica dell'URL. – Suma

+0

Questo richiede la codifica dell'URL per la sicurezza –

2

Si può provare questo.

myUrl += ((myUrl.indexOf('?') == -1) ? '?' : '&'); 
myUrl += "column=9"; 
-2
if (myUrl.indexOf("?") != -1){ 
    // contains query string 
} 
else 
{ 
    // doesn't 
} 
+0

Questa domanda richiede di costruire la stringa di query, non di leggerla. –

+0

Non penso che tu abbia letto la domanda. Si tratta di rilevare i parametri della stringa di query. –

3

tenere tutto in un oggetto fino a che realmente bisogno di una stringa.

Prima popolano l'oggetto da alcuni valori iniziali:

var $_GET = location.search.substr(1).split("&").reduce(function(obj, val){ 
    if(!val) return obj; 
    var pair = val.split("="); 
    obj[pair[0]] = pair[1]; 
    return obj; 
}, {}); 

Considerando URL iniziale: "http://mydomain.com/something?row=1&column=9"

$_GET['column'] = 5; 

$.param($_GET); //"row=1&column=5" 

Array#reduce

22
var myUrl = "http://mydomain.com/something"; 

function addQSParm(name, value) { 
    var re = new RegExp("([?&]" + name + "=)[^&]+", ""); 

    function add(sep) { 
     myUrl += sep + name + "=" + encodeURIComponent(value); 
    } 

    function change() { 
     myUrl = myUrl.replace(re, "$1" + encodeURIComponent(value)); 
    } 
    if (myUrl.indexOf("?") === -1) { 
     add("?"); 
    } else { 
     if (re.test(myUrl)) { 
      change(); 
     } else { 
      add("&"); 
     } 
    } 
} 

console.log(myUrl); 

addQSParm("foo", "asdf"); 
console.log(myUrl); 

addQSParm("bar", "qwerty"); 
console.log(myUrl); 

addQSParm("foo", "123"); 
console.log(myUrl); 

jsFiddle

+3

+1 per 'encodeURIComponent'. :) –

+1

Ottima risposta. Completo, sicuro e comprensibile. –

+0

Usando la regex '([? &]" + Name + "=) ([^ &] +)?' Funzionerà meglio. Ciò consente di trovare parametri vuoti all'interno di un URL. – RugerSR9