使用jQuery获取查询字符串参数

Tro*_*ven 137 javascript url jquery jquery-plugins query-string

有人知道编写jQuery扩展来处理查询字符串参数的好方法吗?我基本上想扩展jQuery魔术($)功能,所以我可以这样做:

$('?search').val(); 
Run Code Online (Sandbox Code Playgroud)

这将使我在下面的网址值"测试": http://www.example.com/index.php?search=test.

我已经看到很多函数可以在jQuery和Javascript中执行此操作,但实际上我希望扩展jQuery以完全按照上面所示的方式工作.我不是在寻找一个jQuery插件,我正在寻找jQuery方法的扩展.

gil*_*ly3 102

为什么要扩展jQuery?扩展jQuery与仅具有全局功能有什么好处?

function qs(key) {
    key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); // escape RegEx meta chars
    var match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)"));
    return match && decodeURIComponent(match[1].replace(/\+/g, " "));
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/gilly3/sgxcL/

另一种方法是解析整个查询字符串并将值存储在对象中供以后使用.这种方法不需要正则表达式并扩展window.location对象(但是,可以很容易地使用全局变量):

location.queryString = {};
location.search.substr(1).split("&").forEach(function (pair) {
    if (pair === "") return;
    var parts = pair.split("=");
    location.queryString[parts[0]] = parts[1] &&
        decodeURIComponent(parts[1].replace(/\+/g, " "));
});
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/gilly3/YnCeu/

此版本也可以使用Array.forEach(),在IE7和IE8中本机不可用.它可以通过在MDN上使用实现来添加,或者您可以使用jQuery $.each()代替.

  • 这并不常见,但在查询参数中使用分号而不是&符号是有效的. (2认同)
  • @nick - 有趣.但是他们建议HTTP服务器将分号视为&符只是为了在使用链接模仿表单提交时使HTML更漂亮.这只是一个建议而且是非标准的.标准格式"GET"提交编码为[`application/x-www-form-urlencoded`](http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1) ,值由`&`分隔.我的代码处理该标准.自定义URL结构(例如您链接的结构)将需要自定义解析器服务器端和客户端.无论如何,在上面的代码中添加这样的功能将是微不足道的. (2认同)
  • 将 "i" 添加到 RegExp() 以便键可以不区分大小写: new RegExp("[?&]"+key+"=([^&]+)(&|$)", "i")); (2认同)

Ram*_*Vel 94

JQuery jQuery-URL-Parser插件做同样的工作,例如检索搜索查询字符串param 的值,你可以使用

$.url().param('search');
Run Code Online (Sandbox Code Playgroud)

此库未被主动维护.正如同一插件的作者建议,您可以使用URI.js.

或者你可以改用js-url.它与下面的相似.

所以你可以访问查询参数 $.url('?search')

  • $ .url()不是函数.得到这个错误. (21认同)
  • 好的解决方案但是如果您碰巧通过file://进行测试将无法工作 (4认同)
  • 嗨@kampsj,使用`file://`协议进行测试会导致更多东西无法正常工作.您可以使用node.js创建一个非常快速简单的静态HTML服务器.http://stackoverflow.com/questions/16333790/node-js-quick-file-server-static-files-over-http (3认同)
  • 尼斯.并且代码在公共域中,因此您甚至不必包含注释. (2认同)
  • 此插件不再维护,作者本身也建议使用其他插件. (2认同)

Clo*_*ign 68

在SitePoint找到我们的朋友发现的这个宝石. https://www.sitepoint.com/url-parameters-jquery/.

使用PURE jQuery.我只是用它而且它有效.稍微调整一下,例如清酒.

//URL is http://www.example.com/mypage?ref=registration&email=bobo@example.com

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.search);

    return (results !== null) ? results[1] || 0 : false;
}

console.log($.urlParam('ref')); //registration
console.log($.urlParam('email')); //bobo@example.com
Run Code Online (Sandbox Code Playgroud)

随意使用.

  • 而不是`结果[1] || 0`,你必须做if(结果){return results [1]} return 0; bcoz查询参数可能根本不存在.修改将处理所有通用案例. (4认同)
  • 如果你有类似 `https://example.com/?c=Order+ID` 的东西你会怎么做?该加号仍然保留在此功能上。 (2认同)

小智 45

这不是我的代码示例,但我过去曾使用它.

//First Add this to extend jQuery

    $.extend({
      getUrlVars: function(){
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for(var i = 0; i < hashes.length; i++)
        {
          hash = hashes[i].split('=');
          vars.push(hash[0]);
          vars[hash[0]] = hash[1];
        }
        return vars;
      },
      getUrlVar: function(name){
        return $.getUrlVars()[name];
      }
    });

    //Second call with this:
    // Get object of URL parameters
    var allVars = $.getUrlVars();

    // Getting URL var by its name
    var byName = $.getUrlVar('name');
Run Code Online (Sandbox Code Playgroud)

  • 你不应该拆分'=',技术上可以在任何键/值对的值中加上第二个等号. - 只有您遇到的第一个等号(每个键/值对)应被视为分隔符.(此外,等号并非严格要求;可以使用没有值的键.) (2认同)

小智 25

经过多年的丑陋字符串解析后,有一种更好的方法:URLSearchParams让我们看一下如何使用这个新API从该位置获取值!

//假设"?post = 1234&action = edit"

var urlParams = new URLSearchParams(window.location.search);
console.log(urlParams.has('post')); // true
console.log(urlParams.get('action')); // "edit"
console.log(urlParams.getAll('action')); // ["edit"]
console.log(urlParams.toString()); // "?post=1234&action=edit"
console.log(urlParams.append('active', '1')); // "?

post=1234&action=edit&active=1"
Run Code Online (Sandbox Code Playgroud)

更新:IE不受支持

使用此函数而不是URLSearchParams

$.urlParam = function (name) {
    var results = new RegExp('[\?&]' + name + '=([^&#]*)')
                      .exec(window.location.href);
    if (results == null) {
         return 0;
    }
    return results[1] || 0;
}

console.log($.urlParam('action')); //edit
Run Code Online (Sandbox Code Playgroud)


Pli*_*pie 15

我写了一个小函数,你只需要解析查询参数的名称.因此,如果您有:?Project = 12&Mode = 200&date = 2013-05-27并且您想要'Mode'参数,您只需要将'Mode'名称解析为函数:

function getParameterByName( name ){
    var regexS = "[\\?&]"+name+"=([^&#]*)", 
  regex = new RegExp( regexS ),
  results = regex.exec( window.location.search );
  if( results == null ){
    return "";
  } else{
    return decodeURIComponent(results[1].replace(/\+/g, " "));
  }
}

// example caller:
var result =  getParameterByName('Mode');
Run Code Online (Sandbox Code Playgroud)


小智 6

基于@Rob Neild上面的答案,这里是一个纯粹的JS改编,返回一个解码查询字符串参数的简单对象(没有%20的等).

function parseQueryString () {
  var parsedParameters = {},
    uriParameters = location.search.substr(1).split('&');

  for (var i = 0; i < uriParameters.length; i++) {
    var parameter = uriParameters[i].split('=');
    parsedParameters[parameter[0]] = decodeURIComponent(parameter[1]);
  }

  return parsedParameters;
}
Run Code Online (Sandbox Code Playgroud)