2012-01-17 22 views
47

mam na przykład następujący adres URL przechowywanego w zmiennej globalnej:Konstruowanie URL z parametrów przy użyciu jQuery

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

Wtedy funkcja musi dodać powiedzmy inny parametr o nazwie „kolumna”. W jaki sposób funkcja ta dodawałaby parametry do wcześniej istniejącego ciągu URL za pomocą jQuery?

Przykład oczekiwanego generowany ciąg:

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

Problemem jest to, że myUrl może również być po prostu:

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

(Należy zauważyć, że nie ma wstępnie istniejące parametry)

+0

Do czego jest to potrzebne? –

+0

Istnieje komponent, który potrzebuje tego adresu URL i ma swój własny sposób pobierania danych przy użyciu AJAX. –

Odpowiedz

45

Sprawdź funkcję jQuery .param(), która powinna wystarczyć.

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

Następnie można po prostu stworzyć funkcję, która dołącza ciąg generowany przez .param() do adresu URL.

+15

Co się stanie, jeśli ciąg ma już parametry? Lub ciąg ma już parametry o tej samej nazwie? – ioquatix

+1

W takim przypadku najlepszą rzeczą jest prawdopodobnie zanalizowanie adresu URL z góry, a następnie przebudowanie go później za pomocą jQuery.param lub podobnego. "Ciąg jest surową strukturą danych ..." – johncip

20

Nie trzeba jQuery, należy użyć funkcji takich jak to:

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

będzie go używać tak:

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

Nie bierze się pod uwagę, że parametr mógł już istnieć. Byłoby oczywiste, kiedy wywołasz go tak, jak robisz w przykładach, ale nie będzie to oczywiste, gdy dodasz parametry do adresu URL, gdy wszystkie parametry pochodzą od innych zmiennych. –

+3

To jest brakujące kodowanie adresu URL. – Suma

+0

To wymaga kodowania adresów URL dla bezpieczeństwa. –

2

Można spróbować.

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

To pytanie dotyczy konstruowania ciągu zapytania, a nie jego czytania. –

+0

Nie sądzę, że czytasz pytanie. Chodzi o wykrycie parametrów ciągu zapytania. –

3

zachować wszystko w obiekcie aż faktycznie potrzebują ciąg.

Pierwszy zapełnić obiekt z początkowych wartości:

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

Biorąc pod uwagę początkowe url: "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 Dla 'encodeURIComponent'. :) –

+1

Świetna odpowiedź. Kompletne, bezpieczne i zrozumiałe. –

+0

Korzystanie z wyrażenia regularnego '([? &]" + Name + "=) ([^ &] +)?' Będzie działać lepiej. Umożliwia to znalezienie pustych parametrów w adresie URL. – RugerSR9

Powiązane problemy