JQuery append params to url
Мне нравится способ jQuery $.ajax() позволяет указать URL-адрес запроса:
{
url: 'http://domain.com/?param=1',
data{
param2: '2'
}
}
$. Метод ajax() будет (возможно) вызывать $.param() на предоставленные данные и необязательно добавлять его к указанному URL.
Мой вопрос: этот тип манипуляций с URL-адресами доступен за пределами вызова $.ajax()?
Например, я хочу открыть всплывающее окно, и я хотел бы создать 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;
}
спасибо!
Ответы
Ответ 1
Поскольку другие ответы не отвечали на мой вопрос, я провел несколько тестов с вызовом $.ajax()
, чтобы увидеть, как он объединяет URL-адреса с данными param.
Мои результаты до сих пор:
- если url содержит a
?
, то $.ajax()
добавит '&'
+ $.param(data)
- если нет, то
$.ajax()
добавит '?'
+ $.param(data)
Итак, если я хочу, чтобы моя функция обработки URL-адресов соответствовала способу $.ajax()
, то это должно быть примерно следующим образом:
var addParams = function( url, data )
{
if ( ! $.isEmptyObject(data) )
{
url += ( url.indexOf('?') >= 0 ? '&' : '?' ) + $.param(data);
}
return url;
}
Мне все еще интересно, есть ли встроенный метод jQuery для этого.
Ответ 2
Вы можете построить строку запроса следующим образом:
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"
}));
Для рекурсивного:
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]
}
}));
Ответ 3
да, вы можете использовать функцию jqueries .param()
для этого.
jsfiddle demo
var params = { param1:"foo", param2:"bar"};
var str = jQuery.param( params );
alert(str);
Ответ 4
Метод 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>