2012-01-17 22 views
47

Tôi có ví dụ URL sau được lưu trữ trong một biến toàn cầu:Xây dựng một URL với các thông số sử dụng jQuery

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

Sau đó, một hàm có thêm giả sử một tham số gọi là "cột". Làm thế nào mà chức năng đó sẽ thêm các tham số vào một chuỗi URL có sẵn bằng cách sử dụng jQuery?

Ví dụ về chuỗi tạo ra mong đợi:

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

Vấn đề là myUrl cũng có thể chỉ là:

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

(Chú ý rằng có những thông số không tồn tại trước)

+0

Bạn cần nó để làm gì? –

+0

Có một thành phần cần URL đó và có cách riêng để tìm nạp dữ liệu bằng AJAX. –

Trả lời

45

Kiểm tra hàm jQuery .param(), điều đó sẽ thực hiện thủ thuật.

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

Bạn có thể sau đó chỉ cần tạo ra một chức năng mà gắn thêm chuỗi được tạo ra bởi .param() để url.

+15

Điều gì sẽ xảy ra nếu chuỗi đã có thông số? Hoặc chuỗi đã có các tham số có cùng tên? – ioquatix

+1

Trong trường hợp đó, điều tốt nhất có thể là phân tích cú pháp URL lên phía trước, sau đó xây dựng lại nó sau với jQuery.param hoặc tương tự. "Chuỗi là cấu trúc dữ liệu hoàn toàn ..." – johncip

20

Bạn không cần jQuery, sử dụng một chức năng như thế này:

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

Bạn sẽ sử dụng nó như thế này:

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

Điều này không tính đến thông số có thể tồn tại. Nó sẽ là rõ ràng khi bạn gọi nó theo cách bạn làm trong các ví dụ, nhưng nó sẽ không được rõ ràng khi bạn thêm các tham số cho URL khi tất cả các tham số đến từ các biến khác. –

+3

Mã này thiếu mã hóa URL. – Suma

+0

Điều này cần mã hóa URL để bảo mật –

2

Bạn có thể thử này.

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

Câu hỏi này yêu cầu về việc xây dựng chuỗi truy vấn, không đọc nó. –

+0

Tôi không nghĩ bạn đã đọc câu hỏi. Đó là về việc phát hiện các tham số chuỗi truy vấn. –

3

Giữ mọi thứ trong một đối tượng cho đến khi bạn thực sự cần một chuỗi.

Đầu tiên cư đối tượng từ một số giá trị ban đầu:

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

Xét url ban đầu là: "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 Đối với 'encodeURIComponent'. :) –

+1

Câu trả lời hay. Hoàn thành, an toàn và dễ hiểu. –

+0

Sử dụng regex '([? &]" + Tên + "=) ([^ &] +)?' Sẽ hoạt động tốt hơn. Điều này cho phép tìm các tham số trống trong URL. – RugerSR9

Các vấn đề liên quan