2012-01-17 61 views
47

我有例如存儲在一個全局變量以下URL參數的URL:構建有使用jQuery

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

那麼功能有加,讓我們說所謂的「」的另一個參數。該函數將如何使用jQuery將參數添加到預先存在的URL字符串中?預期生成的字符串的

實施例:

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

的問題是,myUrl也可能只是:

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

(請注意,有沒有預先存在的參數)

+0

你需要什麼? – 2012-01-17 22:07:40

+0

有一個組件需要這個URL,並有它自己的方式來使用AJAX獲取數據。 – 2012-01-17 22:10:06

回答

45

查看jQuery函數.param(),這應該可以做到。

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

然後,您可以只創建其中追加()的URL通過.PARAM生成的字符串的函數。

+15

如果字符串已經有參數會發生什麼?或者字符串已經具有相同名稱的參數? – ioquatix 2015-02-10 03:01:02

+1

在這種情況下,最好的辦法可能是先解析URL,然後用jQuery.param或類似的方法重建它。 「該字符串是一個嚴酷的數據結構...」 – johncip 2016-05-06 20:32:32

20

你不需要jQuery的,使用這樣的函數:

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

你會使用這樣的:

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

這並沒有考慮到該參數可能已經存在。當你按照你在示例中所做的方式調用它時很明顯,但是當所有參數都來自其他變量時,向URL添加參數時不會很明顯。 – 2016-02-10 18:46:00

+3

這是缺少網址編碼。 – Suma 2016-11-03 09:55:52

+0

這需要安全的URL編碼 – 2018-02-20 22:13:28

2

你可以試試這個。

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

這個問題詢問有關構建查詢字符串,而不是讀取它。 – 2012-12-10 16:49:07

+0

我不認爲你讀過這個問題。這是關於檢測查詢字符串參數。 – 2015-11-14 15:59:08

3

把一切都在一個對象,直到你真正需要的字符串。

首先從一些初始值填充對象:

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

考慮的初始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對於'encodeURIComponent'。 :) – 2012-01-17 22:58:12

+1

很好的答案。完整,安全和可以理解。 – 2016-02-10 18:46:29

+0

使用正則表達式'([?&]「+ name +」=)([^&] +)?'會更好。這使得能夠在URL中找到空的參數。 – RugerSR9 2016-09-02 15:35:50