303

我正在寻找一个可以获取 URL 参数并支持此搜索字符串而不输出 JavaScript 错误的 jQuery 插件:“格式错误的 URI 序列”。如果没有支持此功能的 jQuery 插件,我需要知道如何修改它以支持此功能。

?search=%E6%F8%E5

解码后 URL 参数的值应为:

æøå

(字符是挪威语)。

我无权访问服务器,所以我无法修改它上面的任何内容。

4

19 回答 19

418
function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}
于 2009-09-10T08:38:09.217 回答
294

以下是我根据此处的评论创建的内容,以及修复未提及的错误(例如实际返回 null,而不是“null”):

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}
于 2012-01-06T20:28:37.490 回答
107

您真正想要的是jQuery URL Parser 插件。使用此插件,获取特定 URL 参数(对于当前 URL)的值如下所示:

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

如果你想要一个以参数名作为键、参数值作为值的对象,你只需在param()没有参数的情况下调用,如下所示:

$.url().param();

这个库也适用于其他 url,而不仅仅是当前的:

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

由于这是一个完整的 URL 解析库,您还可以从 URL 中获取其他信息,例如指定的端口或路径、协议等:

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

它还具有其他功能,请查看其主页以获取更多文档和示例。

与其为这个在大多数情况下都可以工作的特定目的编写自己的 URI 解析器,不如使用实际的 URI 解析器。根据答案,来自其他答案的代码可以返回而不是,不适用于空参数 ( ),无法一次解析并返回所有参数,如果您重复查询 URL 中的参数等,则重复工作。'null'null?foo=&bar=x

使用实际的 URI 解析器,不要自己发明。

对于那些不喜欢 jQuery 的人,有一个纯 JS 版本的插件

于 2012-06-01T00:18:54.277 回答
43

如果您不知道 URL 参数是什么,并且想要使用参数中的键和值获取对象,则可以使用以下命令:

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

使用 url 调用 getParameters()/posts?date=9/10/11&author=nilbus会返回:

{
  date:   '9/10/11',
  author: 'nilbus'
}

我不会在此处包含代码,因为它离问题更远,但是 weareon.net 发布了一个库,它也允许在 URL 中操作参数:

于 2012-01-18T16:23:13.130 回答
40

您可以使用浏览器本机location.search属性:

function getParameter(paramName) {
  var searchString = window.location.search.substring(1),
      i, val, params = searchString.split("&");

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

但是有一些 jQuery 插件可以帮助你:

于 2009-09-10T07:51:44.823 回答
25

根据999 的回答

function getURLParameter(name) {
    return decodeURIComponent(
        (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
    );  
}

变化:

  • decodeURI()被替换为decodeURIComponent()
  • [?|&]在正则表达式的开头添加
于 2011-12-22T13:58:25.773 回答
6

需要添加 i 参数使其不区分大小写:

  function getURLParameter(name) {
    return decodeURIComponent(
      (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
    );
  }
于 2012-12-18T14:48:31.443 回答
3

在阅读了所有答案后,我最终得到了这个版本,带有 + 第二个函数来使用参数作为标志

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)','i').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

function isSetURLParameter(name) {
    return (new RegExp('[?|&]' + name + '(?:[=|&|#|;|]|$)','i').exec(location.search) !== null)
}
于 2013-05-06T18:22:07.380 回答
2
$.urlParam = function(name){
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
  return (results !== null) ? results[1] : 0;
}

$.urlParam("key");
于 2012-05-24T04:30:19.180 回答
2

例如,返回任何参数变量值的函数。

function GetURLParameter(sParam)
{
    var sPageURL = window.location.search.substring(1);
    var sURLVariables = sPageURL.split('&');
    for (var i = 0; i < sURLVariables.length; i++)
    {
        var sParameterName = sURLVariables[i].split('=');
        if (sParameterName[0] == sParam)
        {
            return sParameterName[1];
        }
    }
}​

假设 URL 是,这就是你如何使用这个函数,

“http://example.com/?technology=jquery&blog=jquerybyexample”。

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

所以在上面的代码中,变量“tech”的值为“jQuery”,而“blog”变量的值为“jquerybyexample”。

于 2013-01-22T08:55:42.063 回答
2

你不应该将 jQuery 用于这样的事情!
现代方法是通过像 Bower 这样的包管理器使用小型可重用模块。

我创建了一个可以将查询字符串解析为对象的小模块。像这样使用它:

// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå
于 2013-11-15T02:29:13.473 回答
0

这里有很多错误代码,正则表达式解决方案非常慢。我找到了一个比正则表达式快 20 倍并且非常简单的解决方案:

    /*
    *   @param      string      parameter to return the value of.
    *   @return     string      value of chosen parameter, if found.
    */
    function get_param(return_this)
    {
        return_this = return_this.replace(/\?/ig, "").replace(/=/ig, ""); // Globally replace illegal chars.

        var url = window.location.href;                                   // Get the URL.
        var parameters = url.substring(url.indexOf("?") + 1).split("&");  // Split by "param=value".
        var params = [];                                                  // Array to store individual values.

        for(var i = 0; i < parameters.length; i++)
            if(parameters[i].search(return_this + "=") != -1)
                return parameters[i].substring(parameters[i].indexOf("=") + 1).split("+");

        return "Parameter not found";
    }

console.log(get_param("parameterName"));

正则表达式不是万能的解决方案,对于这类问题,简单的字符串操作可以更有效地工作。代码源

于 2013-07-02T01:04:15.930 回答
0
<script type="text/javascript">
function getURLParameter(name) {
        return decodeURIComponent(
            (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
        );
    }

</script>

getURLParameter(id)getURLParameter(Id)工作相同:)

于 2013-08-06T09:13:52.233 回答
0

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

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

example.com?param1=name&param2=&id=6

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

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

console.log(decodeURIComponent($.urlParam('city'))); 
//output: Gold Coast
于 2014-08-18T08:48:52.890 回答
-1
function getURLParameters(paramName) 
{
        var sURL = window.document.URL.toString();  
    if (sURL.indexOf("?") > 0)
    {
       var arrParams = sURL.split("?");         
       var arrURLParams = arrParams[1].split("&");      
       var arrParamNames = new Array(arrURLParams.length);
       var arrParamValues = new Array(arrURLParams.length);     
       var i = 0;
       for (i=0;i<arrURLParams.length;i++)
       {
        var sParam =  arrURLParams[i].split("=");
        arrParamNames[i] = sParam[0];
        if (sParam[1] != "")
            arrParamValues[i] = unescape(sParam[1]);
        else
            arrParamValues[i] = "No Value";
       }

       for (i=0;i<arrURLParams.length;i++)
       {
                if(arrParamNames[i] == paramName){
            //alert("Param:"+arrParamValues[i]);
                return arrParamValues[i];
             }
       }
       return "No Parameters Found";
    }

}
于 2012-01-05T20:21:19.027 回答
-1

我创建了一个简单的函数来从这样的 URL 获取 JavaScript 中的 URL 参数:

.....58e/web/viewer.html?page=*17*&getinfo=33


function buildLinkb(param) {
    var val = document.URL;
    var url = val.substr(val.indexOf(param))  
    var n=parseInt(url.replace(param+"=",""));
    alert(n+1); 
}
buildLinkb("page");

输出:18

于 2012-08-04T12:01:51.837 回答
-1

以防万一你们有 localhost/index.xsp?a=1#something 之类的 url,并且您需要获取参数而不是哈希。

var vars = [], hash, anchor;
var q = document.URL.split('?')[1];
if(q != undefined){
    q = q.split('&');
    for(var i = 0; i < q.length; i++){
        hash = q[i].split('=');
        anchor = hash[1].split('#');
        vars.push(anchor[0]);
        vars[hash[0]] = anchor[0];
    }
}
于 2012-09-25T08:27:53.257 回答
-1

@pauloppenheim 对答案稍作修改,因为它无法正确处理可能是其他参数名称一部分的参数名称。

例如:如果您有“appenv”和“env”参数,重新定义“env”的值可以获取“appenv”值。

使固定:

var urlParamVal = function (name) {
    var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search);
    return result ? decodeURIComponent(result[2]) : "";
};
于 2013-07-30T21:29:16.640 回答
-2

这可能会有所帮助。

<script type="text/javascript">
    $(document).ready(function(){
        alert(getParameterByName("third"));
    });
    function getParameterByName(name){
        var url     = document.URL,
            count   = url.indexOf(name);
            sub     = url.substring(count);
            amper   = sub.indexOf("&"); 

        if(amper == "-1"){
            var param = sub.split("=");
            return param[1];
        }else{
            var param = sub.substr(0,amper).split("=");
            return param[1];
        }

    }
</script>
于 2012-09-13T01:34:12.483 回答