jQuery将参数添加到URL

13

我喜欢jQuery的$.ajax()方法允许指定请求URL的方式:

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

$.ajax() 方法(可能)会在提供的数据上调用 $.param(),并可选择将其附加到提供的 URL 中。

我的问题是:这种类型的 URL 操作是否可以在 $.ajax() 调用之外使用?

例如,我想打开一个弹出窗口,并且希望像使用 $.ajax() 一样构造 URL。

我编写了一个函数来实现此操作,但我感觉自己正在重新发明轮子并复制 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;
}

thanks!

5个回答

7

其他回答没有回答我的问题,我对$.ajax()调用进行了一些测试,以查看它如何将URL与参数数据合并。

到目前为止,我的发现是:

  • 如果URL包含 ?,则$.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方法可以实现这一点。

3
你可以使用jQuery的.param()函数来实现这个功能。

jsfiddle演示

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

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]
    }
}));

1
“Uncaught ReferenceError: serialize is not defined” - 看起来您仍在重新发明轮子,只是以不同的方式。 - Quentin
1
你的 getQueryStr 方法和 jQuery 的 $.param() 有什么不同?我的问题是如何向已包含查询字符串的现有 URL 添加参数。 $.ajax() 方法可以很好地处理这个问题。 - Karolis

1

正如这个 Stack Overflow 的答案所提到的,只需使用 URLSearchParams 即可。

let urlParams = new URLSearchParams(location.search.substr(1));
urlParams.set(key, value);

其中key=value是您想要添加的新URL参数

您可以在这里检查浏览器兼容性


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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接