使用jQuery / Javascript(查询字符串)获取查询字符串参数URL值

192

有没有什么好的方法编写 jQuery 扩展来处理查询字符串参数?我基本上想扩展 jQuery 魔术符 ($) 函数,这样我就可以像这样做:

$('?search').val(); 

如何从以下URL中获取值为"test": http://www.example.com/index.php?search=test

我看到很多jQuery和Javascript函数可以实现这一点,但实际上我想扩展jQuery以完全按照上面所示的方式工作。 我不是要寻找一个jQuery插件,而是要寻找一个扩展jQuery方法的方法。


4
被问及并已回答: https://dev59.com/nHNA5IYBdhLWcg3wmfAa - Nico Westerdale
1
@NicoWesterdale - 我看了那个链接,但没有看到任何解决这个特定问题的答案。他说他想要完全像上面那样的东西。 - mrtsherman
2
我认为你无法做到这一点,传入的字符串将由sizzler解析,然后解析为DOM对象数组。你可以扩展匹配器以提供自定义过滤器,但你无法基于字符串创建一个jquery对象。 - Andrew
6
“$”不已经重载得足够了吗? - Quentin
1
@mrtsherman,请查看我提供的链接中的getParameterByName()函数。不,你不能直接在$提示符中执行此操作,但这不是jQuery选择器的用途。他只是选择URL字符串的一部分,而不是尝试访问DOM的一部分,这就是$()的作用。这是完全不同的事情。如果你真的想使用jQuery,你可以编写一个使用这个语法的插件:$.getParameterByName(param),在我链接到的页面下面有一个示例。但这有点毫无意义。 - Nico Westerdale
10个回答

151

经过多年的丑陋字符串解析,现在有了更好的方法:URLSearchParams。让我们看看如何使用这个新的API从位置中获取值!

//Assuming URL has "?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"

更新:不支持 IE 浏览器

请使用下面的答案中的此函数,而不是使用 URLSearchParams

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

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

console.log($.urlParam('action')); //edit

1
URLSearchParams是否被所有浏览器支持? - divine
1
@divine - 这里有一个URLSearchParams的polyfill:https://github.com/WebReflection/url-search-params - Yogi
无法与以下网址一起使用:https://mytest.com/bippo/#/?utm_source=teeesthttps://mytest.com/bippo/#/url/?utm_source=teeest - Toskan
解决方案不完整,应该调用 decodeURIComponent 并将 + 替换为空格...请参阅先前的解决方案。 - farialima
另一个 polyfill 是 https://github.com/jerrybendy/url-search-params-polyfill。 - Maytha8
显示剩余2条评论

114
为什么要扩展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, " "));
}

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, " "));
});

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

此版本还使用了 Array.forEach(),但在IE7和IE8中无法本地使用。可以通过 MDN上的实现 添加它,或者您可以使用jQuery的 $.each() 替代。

2
虽然不常见,但在查询参数中使用分号而不是和号是有效的。 - Muhd
@Muhd - 只要您的代码能够理解,使用任何分隔符都是“有效”的。但是,当表单被提交时,表单字段将作为“name=value”对提交,由“&”分隔。如果您的代码使用自定义查询字符串格式,显然,您需要在查询字符串被消耗的任何地方编写自定义查询字符串解析器,无论是在服务器端还是客户端。 - gilly3
2
@nick - 有趣。但是他们建议HTTP服务器将分号视为和号,仅在使用链接模拟表单提交时使HTML更漂亮。这只是一个建议,不是标准。标准的表单“GET”提交被编码为application/x-www-form-urlencoded,值由&分隔。我的代码处理该标准。像您链接的自定义URL结构将需要自定义解析器服务器端和客户端。无论如何,在我的上述代码中添加这种功能都是微不足道的。 - gilly3
1
@gilly确实 - 如果您想要便携式的代码,您需要支持双方。 - nick
2
在 RegExp() 中添加 "i" 以使键不区分大小写:new RegExp("[?&]"+key+"=([^&]+)(&|$)", "i")); - Yovav
显示剩余4条评论

96

jQuery jQuery-URL-Parser 插件可以完成同样的工作,例如要检索“search”查询字符串参数的值,您可以使用:

$.url().param('search');

这个库没有得到积极的维护。正如同类插件的作者所建议的那样,你可以使用URI.js

或者你可以使用js-url。它与下面的插件非常相似。

因此,你可以像这样访问查询参数$.url('?search')


2
好的。并且这段代码是公共领域的,所以你甚至不需要包括注释。 - Muhd
4
好的解决方案,但如果您是通过 file:// 进行测试,则无法使用。 - kampsj
1
那跟@kampsj有什么关系? - RameshVel
3
嗨@kampsj,使用“file://”协议进行测试会导致许多功能无法正常工作。您可以使用node.js创建一个非常快速且简单的静态HTML服务器。https://dev59.com/7WQo5IYBdhLWcg3wE8C2 - Jess
2
这个插件已经不再维护,作者本人建议使用其他插件代替。 - JanErikGunnar
显示剩余5条评论

95

在我们朋友SitePoint上发现了这个好东西。 https://www.sitepoint.com/url-parameters-jquery/.

使用纯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

随意使用。


1
你应该使用window.location.search而不是.href -- 其他方面没问题。 - BrainSlugs83
4
代替results [1] || 0,你需要使用if (results) {return results [1]} return 0;,因为查询参数可能根本不存在。修改后可以处理所有通用情况。 - master_dodo
2
如果你有类似于 https://example.com/?c=Order+ID 这样的东西,你该怎么办?这个加号仍然存在于这个函数中。 - Volomike
1
“纯使用jQuery。” 这个解决方案实际上并没有使用任何jQuery。它只是通过扩展jQuery来实现,这本来可以作为一个独立的函数。 - Code-Apprentice
$.urlParam = function(name){ var results = new RegExp('[?&]' + name + '=([^&#]*)').exec(window.location.href); if (results==null){ return null; } else{ return results[1] || 0; } } - Alejandro Haro
显示剩余6条评论

48

以下不是我的代码示例,但我过去使用过它。

//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');

2
不应该在“=”上进行拆分,因为在任何键/值对的值中有第二个等号是技术上可以接受的。-- 每个键/值对只应将首个等号视为分隔符。(此外,等号并非严格要求;可以有一个没有值的键。) - BrainSlugs83
干净的解决方案。在我的情况下完美地工作了。 - JF Gagnon
$.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('='); var k = hash.shift(); vars.push(k); vars[k] = hash.join(""); } return vars; }, getUrlVar: function(name){ return $.getUrlVars()[name]; } }); - Mupinc

17

我写了一个小函数,你只需要解析查询参数的名称。所以如果你有这样的查询参数:?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');

如果你的名称没有垃圾字符,你可以省略第一个正则表达式,并且从location.search开始更有意义。 - mplungjan

8

在@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;
}

我使用这段代码时没有看到任何错误。你用的是什么浏览器?我已经在最新版本的Firefox、Chrome和Safari中进行了测试。 - user1936007
对不起,我看错了。我以为它在调用一个返回未定义的东西的方法。实际上只是在搜索为空时运行一次。然后你会得到 {"": "undefined"}。 - Jerinaw
是的,那可能需要一些改进。 - user1936007

3
function parseQueryString(queryString) {
    if (!queryString) {
        return false;
    }

    let queries = queryString.split("&"), params = {}, temp;

    for (let i = 0, l = queries.length; i < l; i++) {
        temp = queries[i].split('=');
        if (temp[1] !== '') {
            params[temp[0]] = temp[1];
        }
    }
    return params;
}

我使用这个。

2

使用纯Javascript编写

     //Get URL
     var loc = window.location.href;
     console.log(loc);
     var index = loc.indexOf("?");
     console.log(loc.substr(index+1));
     var splitted = loc.substr(index+1).split('&');
     console.log(splitted);
     var paramObj = [];
     for(var i=0;i<splitted.length;i++){
         var params = splitted[i].split('=');
         var key = params[0];
         var value = params[1];
         var obj = {
             [key] : value
         };
         paramObj.push(obj);
         }
    console.log(paramObj);
    //Loop through paramObj to get all the params in query string.

1

function getQueryStringValue(uri, key) {        
        var regEx = new RegExp("[\\?&]" + key + "=([^&#]*)");        
        var matches = uri.match(regEx);
        return matches == null ? null : matches[1];
}

function testQueryString(){
   var uri = document.getElementById("uri").value;
   var searchKey = document.getElementById("searchKey").value;
   var result = getQueryStringValue(uri, searchKey);
   document.getElementById("result").value = result;
}
<input type="text" id="uri" placeholder="Uri"/>
<input type="text" id="searchKey" placeholder="Search Key"/>
<Button onclick="testQueryString()">Run</Button><br/>

<input type="text" id="result" disabled placeholder="Result"/>


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