2015-02-20 1 views
10

Мне нравится, как метод JQuery в $ .ajax() позволяет указать URL запроса:JQuery добавить Params к URL

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

$ .ajax() метод будет (возможно) вызов $ .param() на условии данных и, возможно, добавить его к указанному URL-адресу.

Мой вопрос: этот тип манипуляций с URL доступен за пределами $ .ajax() call?

Например, я хочу открыть всплывающее окно, и я хотел бы создать URL-адрес таким же образом, как и с $ .ajax().

Я написал функцию, которая делает это, но у меня есть чувство, что я буду изобретать колесо и дублирующий уже существующую функцию 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; 
} 

спасибо!

ответ

5

Поскольку другие ответы не ответили на мой вопрос, я сделал несколько тестов с $.ajax() вызова, чтобы увидеть, как она сливается URLs с данными Param.

Мои результаты до сих пор:

  • если URL содержит ?, то $.ajax() добавит '&' + $.param(data)
  • если нет, то $.ajax() будет добавлять '?' + $.param(data)

Так что, если я хочу, чтобы моя функция обработки URL-адресов соответствовала тому, как это делается $.ajax(), тогда это должно быть что-то похожее e:

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

    return url; 
    } 

Мне все еще интересно, есть ли встроенный метод jQuery для этого.

1

Метод param будет генерировать для вас строку запроса, но вам нужно будет удалить существующую строку запроса.

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

'Uncaught ReferenceError: serialize не определен' - и похоже, что вы все еще изобретаете колесо, иначе. – Quentin

+1

Как ваш метод getQueryStr отличается от jQuerys '$ .param()'? Мой вопрос заключался в добавлении аргументов в существующий url, который уже содержит строку запроса. Метод '$ .ajax()' обрабатывает это очень хорошо. – Karolis

2

да, вы можете использовать jqueries .param() функцию, чтобы сделать это.

jsfiddle demo

var params = { param1:"foo", param2:"bar"}; 
var str = jQuery.param(params); 
alert(str);