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

IT技术 javascript jquery url jquery-plugins query-string
2021-02-10 11:46:19

任何人都知道编写 jQuery 扩展来处理查询字符串参数的好方法吗?我基本上想扩展 jQuery 魔法($)函数,这样我就可以做这样的事情:

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

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

我已经看到很多可以在 jQuery 和 Javascript 中执行此操作的函数,但我实际上想扩展 jQuery 以使其完全按照上面显示的方式工作。我不是在寻找 jQuery 插件,而是在寻找 jQuery 方法的扩展。

6个回答

为什么要扩展 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()代替。

@Muhd - 只要您的代码理解它,在查询字符串中使用您喜欢的任何分隔符都是“有效的”。但是,当提交表单时,表单字段是name=value成对提交的,以&. 如果您的代码使用自定义查询字符串格式,很明显,您需要在使用查询字符串的任何地方编写自定义查询字符串解析器,无论是在服务器上还是客户端上。
2021-03-17 11:46:19
@nick - 有趣。但是,他们建议 HTTP 服务器将分号视为 & 符号,这只会在使用链接模拟表单提交时使 HTML 更漂亮。这只是一个建议,是非标准的。标准表单GET提交被编码为application/x-www-form-urlencoded,值由&. 我的代码处理该标准。自定义 url 结构(例如您链接的那个)需要自定义解析器服务器端和客户端。无论如何,向我上面的代码添加这样的功能将是微不足道的。
2021-03-20 11:46:19
将“i”添加到 RegExp() 以便键可以不区分大小写: new RegExp("[?&]"+key+"=([^&]+)(&|$)", "i"));
2021-04-07 11:46:19
这并不常见,但在查询参数中使用分号代替与号是有效的。
2021-04-08 11:46:19
@gilly 确实 - 如果你想要可移植的代码,你需要同时支持
2021-04-08 11:46:19

经过多年的丑陋字符串解析,有一个更好的方法: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
2021-03-17 11:46:19
如果您为不受支持的浏览器添加 polyfill,则此 URLSearchParams 解决方案效果很好。github.com/ungap/url-search-params
2021-04-01 11:46:19
哎呀!哦,伙计,不支持 IE !!我刚刚对其进行了测试。而 Chrome、FF、Safari 则没有问题。
2021-04-04 11:46:19
不会与 say https://mytest.com/bippo/#/?utm_source=teeestor 一起 工作https://mytest.com/bippo/#/url/?utm_source=teeest
2021-04-04 11:46:19
所有浏览器都支持 URLSearchParams 吗?
2021-04-08 11:46:19

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

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

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

或者您可以改用js-url它与下面的非常相似。

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

嗨@kampsj,使用file://协议进行测试会导致更多东西不起作用。您可以使用 node.js 创建一个非常快速和简单的静态 HTML 服务器。 stackoverflow.com/questions/16333790/...
2021-03-16 11:46:19
很好的解决方案,但如果您碰巧通过 file:// 进行测试,则无法使用
2021-03-26 11:46:19
该插件不再维护,作者本人建议使用其他插件代替。
2021-03-26 11:46:19
有什么关系,@kampsj
2021-04-07 11:46:19
好的。并且代码在公共领域中,因此您甚至不必包含注释。
2021-04-13 11:46:19

在 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

随意使用。

“使用纯 jQuery。” 此解决方案实际上不使用任何 JQuery。它只是用一个很容易成为独立函数的东西来扩展 JQuery。
2021-03-22 11:46:19
伟大的。谢谢!不过,我认为您不需要最后一个大括号标记。
2021-03-24 11:46:19
如果你有类似的东西,你会怎么做https://example.com/?c=Order+ID该加号仍然保留在此功能上。
2021-03-25 11:46:19
而不是results[1] || 0,你必须做 if (results) {return results[1]} return 0; bcoz 查询参数可能根本不存在。修改将处理所有通用情况。
2021-03-26 11:46:19
您应该使用 window.location.search 而不是 .href —— 否则,很好。
2021-04-08 11:46:19

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

//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');
您不应该在 '=' 上拆分,技术上可以在任何键/值对的值中使用第二个等号。-- 只有您遇到的第一个等号(每个键/值对)才应被视为分隔符。(此外,等号不是严格要求的;键可能没有值。)
2021-03-29 11:46:19
$.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]; } });
2021-03-31 11:46:19
清洁溶液。在我的情况下完美地工作。
2021-04-11 11:46:19