ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 jQuery 或纯 JavaScript 获取 URL 参数?

我见过很多参数大小和名称未知的 jQuery 示例。

我的 URL 只会有 1 个字符串:

http://example.com?sent=yes

我只想检测:

发送存在吗?是否等于“是”?

我见过的最佳解决方案 [这里][1] [1]:stackoverflow.com/a/901144/3106590
现在有一个插件/库,称为 URI.js:github.com/medialize/URI.js

A
Andrew Bennet

最佳解决方案 here

var getUrlParameter = function getUrlParameter(sParam) {
    var sPageURL = window.location.search.substring(1),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
        }
    }
    return false;
};

这就是假设 URL 为,
http://dummy.com/?technology=jquery&blog=jquerybyexample 时如何使用此函数。

var tech = getUrlParameter('technology');
var blog = getUrlParameter('blog');

谢谢!但是当复制这个时,我发现了一个令人讨厌的惊喜,在结尾处包含一个零宽度的空白 (\u200b)。使脚本具有不可见的语法错误。
为空搜索返回 falsenull
这个解决方案对我来说效果很好我刚刚使用过 var sPageURL = decodeURI(window.location.search.substring(1));将 %20 个字符转换为空格,如果参数不匹配,我也会返回一个空字符串而不是什么。
我已更新答案以包含此评论上方的所有评论代码更改。
应该对参数值进行解码(正如 Iouri 建议的那样)。如果在 url 上完成解码(如答案中所示),如果参数值中有编码的 &=,它将无法正常工作。
O
Optio

2022 年的解决方案

我们有:http://example.com?sent=yes

let searchParams = new URLSearchParams(window.location.search)

发送存在吗?

searchParams.has('sent') // true

是否等于“是”?

let param = searchParams.get('sent')

然后只是比较它。


我认为这在浏览器中不受支持,那么为什么要使用它呢?参考 - developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
目前无法在 IE / Edge 中工作,因此功能检测:if ('URLSearchParams' in window) { // Browser supports URLSearchParams} See here
对我和我的目标受众来说已经足够好了。 caniuse.com/#feat=urlsearchparams
@p_champ Edge 在 v17(2018 年 4 月)中获得支持。让IE死。
这是现代问题的现代解决方案。
d
davidrl1000

jQuery 代码片段获取存储在 url 中作为参数的动态变量,并将它们存储为 JavaScript 变量,以便与您的脚本一起使用:

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

example.com?param1=name¶m2=&id=6

$.urlParam('param1'); // name
$.urlParam('id');        // 6
$.urlParam('param2');   // null

带空格的示例参数

http://www.jquery4u.com?city=Gold Coast
console.log($.urlParam('city'));  
//output: Gold%20Coast



console.log(decodeURIComponent($.urlParam('city'))); 
//output: Gold Coast

注意:如果有特殊字符作为参数或变音符号等,您需要解码。因此,应该是 return decodeURI(results[1]) || 0; 而不是 return results[1] || 0;
只是好奇,为什么它需要 || 0 部分,因为已经检查了结果,它不总是返回匹配数组吗?
@AirWick219 适当的故障保护。虽然多余,但谨慎一点也无妨
这里很可能是原始来源:sitepoint.com/url-parameters-jquery 但这个答案添加了一些新想法
不确定是否值得为此使用 jQuery。
A
AwokeKnowing

我总是把它当作一条线。现在 params 有变量:

params={};location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(s,k,v){params[k]=v})

多线:

var params={};
window.location.search
  .replace(/[?&]+([^=&]+)=([^&]*)/gi, function(str,key,value) {
    params[key] = value;
  }
);

作为一个函数

function getSearchParams(k){
 var p={};
 location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi,function(s,k,v){p[k]=v})
 return k?p[k]:p;
}

您可以将其用作:

getSearchParams()  //returns {key1:val1, key2:val2}

或者

getSearchParams("key1")  //returns val1

r
rodnaph

还有一个替代功能...

function param(name) {
    return (location.search.split(name + '=')[1] || '').split('&')[0];
}

这是错误的!例如 OP 示例中的 param('t') == param('sent') == 'yes'。这是一个修复:return (location.search.split(new RegExp('[?&]' + name + '='))[1] || '').split('&')[0];另请注意,您无法判断参数是否存在,因为缺少参数会得到空字符串。
//(强制存在完整的密钥,而不是只存在密钥的最后一部分)return (location.search.split('?' + name + '=')[1] || location.search.split('&' + name + '=')[1] || '').split('&')[0];
S
Sariban D'Cl

可能为时已晚。但是这种方法非常简单易行

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990 -->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')      // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')       // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});

更新
需要 url 插件:plugins.jquery.com/url
谢谢 -Ripounet


决定这个的人应该首先检查回购。用法发生了变化。 $.url.attr('message') 变成 $.url("query") 并且它只给出完整的查询!为了只得到一个参数,我必须: $.url("query").split("=")[1] url github link
X
Xin

使用 URLSearchParams

var params = new window.URLSearchParams(window.location.search);
console.log(params.get('name'));

注意兼容性(大多数情况下都可以,但 IE 和 Edge 可能不同,请查看此兼容性参考:https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams


URLSearchParams 将特殊字符“+”替换为空格。因此,如果您的 url 参数中有一个“+”,它将被替换。
C
Community

或者你可以使用这个简洁的小功能,因为为什么解决方案过于复杂?

function getQueryParam(param, defaultValue = undefined) {
    location.search.substr(1)
        .split("&")
        .some(function(item) { // returns first occurence and stops
            return item.split("=")[0] == param && (defaultValue = item.split("=")[1], true)
        })
    return defaultValue
}

简化和单行时看起来更好:

tl;dr 单线解决方案

var queryDict = {};
location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]})
result:
queryDict['sent'] // undefined or 'value'

但是,如果您有编码字符或多值键怎么办?

你最好看看这个答案:How can I get query string values in JavaScript?

潜行高峰

"?a=1&b=2&c=3&d&e&a=5&a=t%20e%20x%20t&e=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dståle%26car%3Dsaab"
> queryDict
a: ["1", "5", "t e x t"]
b: ["2"]
c: ["3"]
d: [undefined]
e: [undefined, "http://w3schools.com/my test.asp?name=ståle&car=saab"]

> queryDict["a"][1] // "5"
> queryDict.a[1] // "5"

字符串拆分也可能比正则表达式更快。考虑到 url 只会被解析一次,这并不是一个因素。
这是跨浏览器对我来说完美的解决方案(第一个) - 谢谢!
@NickyTheWrench 很高兴听到这个消息,谢谢!无论如何,请注意这是一个非常简单的解决方案,如果您获得包含特殊字符的复杂 url 参数,您最好检查提供的链接。
@Qwerty 是的-我的用例非常简单,参数始终相同等(基本上正是OP所要求的)再次感谢!
@BernardVanderBeken 有趣,我修好了,无论如何,这是一个非常愚蠢的解决方案,底部支持编码字符和数组的解决方案要好得多。
S
Shuhad zaman

这个很简单,对我有用

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

所以如果你的网址是 http://www.yoursite.com?city=4

尝试这个

console.log($.urlParam('city'));

f
fabsenet

也许您可能想看看Dentist JS? (免责声明:我编写了代码)

代码:

document.URL == "http://helloworld.com/quotes?id=1337&author=kelvin&message=hello"
var currentURL = document.URL;
var params = currentURL.extract();
console.log(params.id); // 1337
console.log(params.author) // "kelvin"
console.log(params.message) // "hello"

使用 Dentist JS,您基本上可以对所有字符串(例如 document.URL.extract() )调用 extract() 函数,然后您会返回找到的所有参数的 HashMap。它也可以定制以处理分隔符和所有内容。

缩小版 < 1kb


a
apaderno

我希望这将有所帮助。

 <script type="text/javascript">
   function getParameters() {
     var searchString = window.location.search.substring(1),
       params = searchString.split("&"),
       hash = {};

     if (searchString == "") return {};
     for (var i = 0; i < params.length; i++) {
       var val = params[i].split("=");
       hash[unescape(val[0])] = unescape(val[1]);
     }

     return hash;
   }

    $(window).load(function() {
      var param = getParameters();
      if (typeof param.sent !== "undefined") {
        // Do something.
      }
    });
</script>

a
alexw

这可能有点矫枉过正,但现在有一个非常流行的库可用于解析 URI,称为 URI.js

例子

var uri = "http://example.org/foo.html?technology=jquery&technology=css&blog=stackoverflow"; var components = URI.parse(uri); var query = URI.parseQuery(components['query']); document.getElementById("result").innerHTML = "URI = " + uri; document.getElementById("result").innerHTML += "
technology = " + query['technology']; // 如果你查看控制台,你会看到这个库为多值查询生成了一个 JS 数组! console.log(query['technology']); console.log(查询['blog']);


P
Praveen Tiwari

函数 GetRequestParam(param) { var res = null; try{ var qs = decodeURIComponent(window.location.search.substring(1));//get all after then '?'在 URI 中 ar = qs.split('&'); $.each(ar, function(a, b){ var kv = b.split('='); if(param === kv[0]){ res = kv[1]; return false;//break环形 } }); }catch(e){} 返回资源; }


T
Tats_innit

试试这个工作演示 http://jsfiddle.net/xy7cX/

接口:

inArray:http://api.jquery.com/jQuery.inArray/

这应该有助于:)

代码

var url = "http://myurl.com?sent=yes"

var pieces = url.split("?");
alert(pieces[1] + " ===== " + $.inArray("sent=yes", pieces));

仅适用于单个 var - & 会抛出它 - 可以用正则表达式扩展
I
ImBhavin95

如此简单,您可以使用任何网址并获得价值

function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
    results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

使用示例

// query string: ?first=value1&second=&value2
var foo = getParameterByName('first'); // "value1"
var bar = getParameterByName('second'); // "value2" 

注意:如果一个参数多次出现 (?first=value1&second=value2),您将获得第一个值 (value1) 和第二个值 (value2)。


M
Michael Konečný

有这个很棒的图书馆:https://github.com/allmarkedup/purl

这使您可以简单地做

url = 'http://example.com?sent=yes';
sent = $.url(url).param('sent');
if (typeof sent != 'undefined') { // sent exists
   if (sent == 'yes') { // sent is equal to yes
     // ...
   }
}

该示例假设您使用的是 jQuery。你也可以像普通的 javascript 一样使用它,语法会有所不同。


这个库不再维护,但是我使用它,它很棒。确保您使用 param 而不是 attr 来获取这些查询字符串参数,正如作者在他们的示例中所包含的那样。
E
Elia Weiss
http://example.com?sent=yes

最佳解决方案 here

function getUrlParameter(name) {
    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
    var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
    var results = regex.exec(location.href);
    return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, '    '));
};

使用上面的函数,您可以获得单个参数值:

getUrlParameter('sent');

完美答案!
B
Brian F

这会给你一个很好的对象来使用

    function queryParameters () {
        var result = {};

        var params = window.location.search.split(/\?|\&/);

        params.forEach( function(it) {
            if (it) {
                var param = it.split("=");
                result[param[0]] = param[1];
            }
        });

        return result;
    }

接着;

    if (queryParameters().sent === 'yes') { .....

split(/\?|\&/) 这意味着
C
Community

这是基于 Gazoris 的回答,但 URL 对参数进行解码,因此当它们包含数字和字母以外的数据时可以使用它们:

function urlParam(name){
    var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    // Need to decode the URL parameters, including putting in a fix for the plus sign
    // https://stackoverflow.com/a/24417399
    return results ? decodeURIComponent(results[1].replace(/\+/g, '%20')) : null;
}

u
userlond

还有另一个使用 URI.js 库的示例。

示例完全按照要求回答问题。

var url = 'http://example.com?sent=yes'; var urlParams = 新的 URI(url).search(true); // 1. sent 存在吗? var sendExists = urlParams.sent !== 未定义; // 2. 是否等于“是”? var sendIsEqualtToYes = urlParams.sent == '是'; // 以可读形式输出结果 // 生产不需要 if (sendExists) { console.log('Url has "sent" param, its value is "' + urlParams.sent + '"'); if (urlParams.sent == 'yes') { console.log('"Sent" 参数等于 "yes"'); } else { console.log('"Sent" 参数不等于 "yes"'); } } else { console.log('Url has\'t "sent" param'); }


s
stevenspiel

Sameer 答案的 Coffeescript 版本

getUrlParameter = (sParam) ->
  sPageURL = window.location.search.substring(1)
  sURLVariables = sPageURL.split('&')
  i = 0
  while i < sURLVariables.length
    sParameterName = sURLVariables[i].split('=')
    if sParameterName[0] == sParam
      return sParameterName[1]
    i++

s
streaver91

对 Sameer 的回答略有改进,将参数缓存到闭包中,以避免每次调用时解析和循环所有参数

var getURLParam = (function() {
    var paramStr = decodeURIComponent(window.location.search).substring(1);
    var paramSegs = paramStr.split('&');
    var params = [];
    for(var i = 0; i < paramSegs.length; i++) {
        var paramSeg = paramSegs[i].split('=');
        params[paramSeg[0]] = paramSeg[1];
    }
    console.log(params);
    return function(key) {
        return params[key];
    }
})();

s
studio-klik

我使用它并且它有效。 http://codesheet.org/codesheet/NF246Tzs

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
    vars[key] = value;
    });
return vars;
}


var first = getUrlVars()["id"];

D
DDT

使用 vanilla JavaScript,您可以轻松获取参数(location.search),获取子字符串(不带?)并将其转换为数组,方法是用 '&' 分割它。

当您遍历 urlParams 时,您可以使用 '=' 再次拆分字符串,并将其作为 object[elmement[0]] = element[1] 添加到 'params' 对象中。超级简单且易于访问。

http://www.website.com/?error=userError&type=handwritten

            var urlParams = location.search.substring(1).split('&'),
                params = {};

            urlParams.forEach(function(el){
                var tmpArr = el.split('=');
                params[tmpArr[0]] = tmpArr[1];
            });


            var error = params['error'];
            var type = params['type'];

u
user562451

如果 URL 参数中有 & 像 filename="p&g.html"&uid=66 怎么办?

在这种情况下,第一个功能将无法正常工作。所以我修改了代码

function getUrlParameter(sParam) {
    var sURLVariables = window.location.search.substring(1).split('&'), sParameterName, i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
        }
    }
}

B
BaseZen

诚然,我将我的答案添加到一个过度回答的问题中,但这具有以下优点:

-- 不依赖于任何外部库,包括 jQuery

-- 不污染全局函数命名空间,通过扩展'String'

-- 找到匹配后不创建任何全局数据并进行不必要的处理

-- 处理编码问题,并接受(假设)非编码参数名称

-- 避免显式 for 循环

String.prototype.urlParamValue = function() {
    var desiredVal = null;
    var paramName = this.valueOf();
    window.location.search.substring(1).split('&').some(function(currentValue, _, _) {
        var nameVal = currentValue.split('=');
        if ( decodeURIComponent(nameVal[0]) === paramName ) {
            desiredVal = decodeURIComponent(nameVal[1]);
            return true;
        }
        return false;
    });
    return desiredVal;
};

然后你会用它作为:

var paramVal = "paramName".urlParamValue() // null if no match

W
Wahid Masud

如果要从特定 url 中查找特定参数:

function findParam(url, param){
  var check = "" + param;
  if(url.search(check )>=0){
      return url.substring(url.search(check )).split('&')[0].split('=')[1];
  }
}  

var url = "http://www.yourdomain.com/example?id=1&order_no=114&invoice_no=254";  
alert(findParam(url,"order_no"));

N
Niksuski

另一个使用 jQuery 和 JSON 的解决方案,因此您可以通过对象访问参数值。

var loc = window.location.href;
var param = {};
if(loc.indexOf('?') > -1)
{
    var params = loc.substr(loc.indexOf('?')+1, loc.length).split("&");

    var stringJson = "{";
    for(var i=0;i<params.length;i++)
    {
        var propVal = params[i].split("=");
        var paramName = propVal[0];
        var value = propVal[1];
        stringJson += "\""+paramName+"\": \""+value+"\"";
        if(i != params.length-1) stringJson += ",";
    }
    stringJson += "}";
    // parse string with jQuery parseJSON
    param = $.parseJSON(stringJson);
}

假设您的网址是 http://example.com/?search=hello+world&language=en&page=3

之后,只需使用如下参数即可:

param.language

返回

en

最有用的用法是在页面加载时运行它,并使用全局变量在您可能需要的任何地方使用参数。

如果您的参数包含数值,则只需解析该值。

parseInt(param.page)

如果没有参数 param 将只是一个空对象。


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

&被错误地编码为“&amp;”在上述答案中,请参阅正确答案stackoverflow.com/a/25359264/73630
d
ddfsf

用这个

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