2015-02-20 16 views
10

Tôi thích cách phương pháp jQuery $ .ajax() cho phép để xác định yêu cầu url:jQuery thêm params để url

{ 
    url: 'http://domain.com/?param=1', 
    data{ 
    param2: '2' 
    } 
} 

$ .ajax() phương pháp sẽ (có thể) gọi $ .param() trên được cung cấp và thêm tùy chọn vào URL được cung cấp.

Câu hỏi của tôi là: đây là loại thao tác url có sẵn bên ngoài lệnh $ .ajax()?

Ví dụ: tôi muốn mở cửa sổ bật lên và tôi muốn xây dựng URL theo cùng cách tôi làm với $ .ajax().

Tôi đã viết một chức năng mà thực hiện điều này, nhưng tôi có cảm giác tôi đang reinventing the wheel và sao chức năng đã tồn tại của jQuery:

var prepareUrl = function(url, data) 
{ 
    var params = $.param(data); 

    if (params.length > 0) 
    { 
    // url contains a query string 
    if (url.indexOf('?') > -1) 
    { 
     // get last char of url 
     var lastChar = url.substr(url.length - 1); 

     // Append & to the end of url if required 
     if (lastChar != '&' && lastChar != '?') 
     { 
     url += '&'; 
     } 
    } 

    else // url doesn't contain a query string 
    { 
     url += '?'; 
    } 

    url += params; 
    } 

    return url; 
} 

cảm ơn!

Trả lời

5

Kể từ khi trả lời khác không trả lời câu hỏi của tôi, tôi đã thực hiện một vài thử nghiệm với các $.ajax() cuộc gọi để xem nó như thế nào kết hợp với dữ liệu url param.

phát hiện của tôi cho đến nay:

  • nếu url chứa ?, sau đó $.ajax() sẽ nối '&' + $.param(data)
  • nếu không, sau đó $.ajax() sẽ nối '?' + $.param(data)

Vì vậy, nếu tôi muốn giữ chức năng xử lý url của tôi phù hợp với cách $.ajax() làm điều đó, sau đó nó phải là một cái gì đó lik e như sau:

var addParams = function(url, data) 
    { 
    if (! $.isEmptyObject(data)) 
    { 
     url += (url.indexOf('?') >= 0 ? '&' : '?') + $.param(data); 
    } 

    return url; 
    } 

Tôi vẫn tự hỏi liệu có phương pháp jQuery tích hợp để thực hiện việc này hay không.

1

Phương thức param sẽ tạo chuỗi truy vấn cho bạn, nhưng bạn sẽ cần phải xóa chuỗi truy vấn hiện tại.

var base = "http://example.com/foo/?example=old"; 
 
var data = { 
 
    foo: "hello", 
 
    bar: "world?" 
 
}; 
 
var url = base.replace(/\?.*$/, "") + "?" + jQuery.param(data); 
 
alert(url);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

2

You can build query string like this:

getQueryStr = function(obj) { 
    var str = []; 
    for (var p in obj) 
     if (obj.hasOwnProperty(p)) { 
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
     } 
    return str.join("&"); 
} 

console.log(serialize({ 
    param1: "val1", 
    param2: "val2" 
})); 

For recursive :

getQueryStr = function(obj, prefix) { 
    var str = []; 
    for (var p in obj) { 
     if (obj.hasOwnProperty(p)) { 
      var k = prefix ? prefix + "[" + p + "]" : p, 
       v = obj[p]; 
      str.push(typeof v == "object" ? 
       getQueryStr(v, k) : 
       encodeURIComponent(k) + "=" + encodeURIComponent(v)); 
     } 
    } 
    return str.join("&"); 
} 

console.log(serialize({ 
    favfruit: "apple", 
    data: { 
     name: 'js', 
     points: [1, 2, 3] 
    } 
})); 
+1

'Tham chiếu không bắt buộcLỗi: serialize không được xác định' - và có vẻ như bạn vẫn đang phát minh lại bánh xe, chỉ khác nhau. – Quentin

+1

Phương thức 'getQueryStr' của bạn khác với jQuery '$ .param()' như thế nào? Câu hỏi của tôi là về việc thêm đối số vào url hiện tại đã chứa chuỗi truy vấn. Phương thức '$ .ajax()' xử lý rất độc đáo. – Karolis

2

có bạn có thể sử dụng jqueries .param() chức năng để làm điều này.

jsfiddle demo

var params = { param1:"foo", param2:"bar"}; 
var str = jQuery.param(params); 
alert(str); 
Các vấn đề liên quan