Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从location.search获取特定参数?_Javascript_Url - Fatal编程技术网

Javascript 如何从location.search获取特定参数?

Javascript 如何从location.search获取特定参数?,javascript,url,Javascript,Url,如果我有一个URL,比如 http://localhost/search.php?year=2008 如何编写JavaScript函数来获取变量year并查看它是否包含任何内容 我知道它可以通过位置来完成。搜索,但我不知道它是如何获取参数的。一种非正则表达式方法,您可以简单地按字符“&”分割,然后遍历键/值对: function gup( name ) { name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); va

如果我有一个URL,比如

http://localhost/search.php?year=2008
如何编写JavaScript函数来获取变量year并查看它是否包含任何内容


我知道它可以通过
位置来完成。搜索
,但我不知道它是如何获取参数的。

一种非正则表达式方法,您可以简单地按字符“&”分割,然后遍历键/值对:

function gup( name ) {
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if( results == null )
        return "";
    else
        return results[1];
}
var year = gup("year"); // returns "2008"
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 val[1];
    }
  }
  return null;
}

下面使用正则表达式并仅搜索URL的查询字符串部分

最重要的是,此方法支持法线和数组参数,如中所示
http://localhost/?fiz=zip&foo[]=!!=&bar=7890#hashhash

function getQueryParam(param) {
    var result =  window.location.search.match(
        new RegExp("(\\?|&)" + param + "(\\[\\])?=([^&]*)")
    );

    return result ? result[3] : false;
}

console.log(getQueryParam("fiz"));
console.log(getQueryParam("foo"));
console.log(getQueryParam("bar"));
console.log(getQueryParam("zxcv"));
输出:

zip
!!=
7890
false

我最喜欢的获取URL参数的方法是:

var parseQueryString = function() {

    var str = window.location.search;
    var objURL = {};

    str.replace(
        new RegExp( "([^?=&]+)(=([^&]*))?", "g" ),
        function( $0, $1, $2, $3 ){
            objURL[ $1 ] = $3;
        }
    );
    return objURL;
};

//Example how to use it: 
var params = parseQueryString();
alert(params["foo"]); 

我花了一段时间才找到这个问题的答案。大多数人似乎都在建议正则表达式解决方案。我非常喜欢使用经过尝试和测试的代码,而不是我或其他人在动态中想到的正则表达式

我使用此处提供的parseUri库:

它允许您完全按照自己的要求执行:

var uri = 'http://localhost/search.php?year=2008';
var year = uri.queryKey['year'];
// year = '2008'

我使用了Alex的变体,但需要将多次出现的参数转换为数组。似乎有很多选择。我不想依靠另一个图书馆来完成这么简单的事情。我想在这里发布的其他选项之一可能会更好——因为直截了当,我改编了亚历克斯的

parseQueryString = function() {
    var str = window.location.search;
    var objURL = {};

    // local isArray - defer to underscore, as we are already using the lib
    var isArray = _.isArray

    str.replace(
        new RegExp( "([^?=&]+)(=([^&]*))?", "g" ),
        function( $0, $1, $2, $3 ){

            if(objURL[ $1 ] && !isArray(objURL[ $1 ])){
                // if there parameter occurs more than once, convert to an array on 2nd
                var first = objURL[ $1 ]
                objURL[ $1 ] = [first, $3]
            } else if(objURL[ $1 ] && isArray(objURL[ $1 ])){
                // if there parameter occurs more than once, add to array after 2nd
                objURL[ $1 ].push($3)
            }
            else
            {
                // this is the first instance
                objURL[ $1 ] = $3;
            }

        }
    );
    return objURL;
};

最简单的方法是

if (document.location.search.indexOf('yourtext=') >= 0) {
    // your code
} else {
    // what happens?
}
indexOf()
indexOf(text)
函数返回

  • 当函数中传递的文本不在您要查找的任何变量或字符串中时,小于0的整数——在本例中为
    document.location.search
  • 当函数中传递的文本位于您要查找的变量或字符串中时,等于0或更高的整数——在本例中为
    document.location.search

我希望这是有用的,

您可以使用类:


这个问题由来已久,而且在JavaScript中已经有所发展。 您现在可以执行以下操作:

const params = {}
document.location.search.substr(1).split('&').forEach(pair => {
  [key, value] = pair.split('=')
  params[key] = value
})
您将获得包含
2008
params.year
。 您还可以在
params
对象中获得其他查询参数


编辑:一种更短/更简洁的方法:

const params = new Map(location.search.slice(1).split('&').map(kv => kv.split('=')))
然后,您可以测试
年份
参数是否存在:

params.has('year')  // true
或通过以下方式检索:

params.get('year')  // 2008

编辑2020 您可以将URL参数转换为对象:

const params=location.search.slice(1).split('&').reduce((acc,s)=>{
常数[k,v]=s.split('='))
返回Object.assign(acc,{[k]:v})
}, {})
然后可以将其用作常规JS对象:

params.year//2008

我对这个问题做了一些处理,最后我使用了这个:

function getJsonFromUrl() {
  return Object.assign(...location.search.substr(1).split("&").map(sliceProperty));
}
  • 对象。分配
    将对象列表转换为一个对象
  • 扩展运算符
    将数组转换为列表
  • location.search.substr(1).split(“&”)
    以属性数组的形式获取所有参数(
    foo=bar
  • map
    遍历每个属性并将它们拆分为一个数组(调用
    splitProperty
    sliceProperty
splitProperty

  function splitProperty(pair) {
    [key, value] = pair.split("=")
    return { [key]: decodeURIComponent(value) }
  }
  function sliceProperty(pair) {
    const position = pair.indexOf("="),
      key = pair.slice(0, position),
      value = pair.slice(position + 1, pair.length);
    return { [key]: decodeURIComponent(value) }
  }
  • =
  • 将数组解构为两个元素的数组
  • 返回具有动态属性语法的新对象
切片属性

  function splitProperty(pair) {
    [key, value] = pair.split("=")
    return { [key]: decodeURIComponent(value) }
  }
  function sliceProperty(pair) {
    const position = pair.indexOf("="),
      key = pair.slice(0, position),
      value = pair.slice(position + 1, pair.length);
    return { [key]: decodeURIComponent(value) }
  }
  • 设置
    =
    的位置、键和值
  • 返回具有动态属性语法的新对象

我认为
splitProperty
更漂亮,但是
sliceProperty
更快。运行获取更多信息。

一个简单的单线解决方案:

let query=Object.assign.apply(null,location.search.slice(1).split('&').map(entry=>({[entry.split('='))[0]]:entry.split('=')[1]}));
扩展和解释:

//定义变量
让查询;
//获取源查询
query=location.search;
//跳过“?”分隔符
query=query.slice(1);
//按条目分隔符拆分源查询
query=query.split('&');
//用包含查询项的对象替换每个查询项
query=query.map((条目)=>{
//获取查询条目键
让key=entry.split('=')[0];
//获取查询条目值
让value=entry.split('=')[1];
//定义查询对象
让容器={};
//将查询条目添加到对象
容器[键]=值;
//返回查询对象
返回容器;
});
//合并所有查询对象
query=Object.assign.apply(null,query);

从位置抓取参数。用一行搜索:

const params = new Map(this.props.location.search.slice(1).split('&').map(param => param.split('=')))
然后,简单地说:

if(params.get("year")){
  //year exists. do something...
} else {
  //year doesn't exist. do something else...
}
ES6答案:

const parseQueryString = (path = window.location.search) =>
  path.slice(1).split('&').reduce((car, cur) => {
   const [key, value] = cur.split('=')
   return { ...car, [key]: value } 
  }, {})
例如:

parseQueryString('?foo=bar&foobar=baz')
// => {foo: "bar", foobar: "baz"}

这就是我喜欢做的:

window.location.search
    .substr(1)
    .split('&')
    .reduce(
        function(accumulator, currentValue) {
            var pair = currentValue
                .split('=')
                .map(function(value) {
                    return decodeURIComponent(value);
                });

            accumulator[pair[0]] = pair[1];

            return accumulator;
        },
        {}
    );
当然,您可以使用现代语法或将所有内容写在一行中使其更加紧凑


我把这件事留给你。

那里不是一个全局的吗?那么我能做什么呢?(getParameter(“year”)!=“”){var year=getParameter(“year”);document.location.href=page.php?year=$year等。@sarmenhb:你能做:var year=getParameter(“year”);if(year){document.location.href='page.php?year='+year;}@卢卡·马泰斯:不,val不是一个全局变量。它在var searchString,i,val,…中定义为一个本地变量,优雅且易于使用!为什么不将其标记为答案?您应该使用
window.location.search
而不是
window.location.href
。这将简化您的表达式,而不必检查哈希或查询markersIt在创建一个正则表达式之前,最好先转义“name”中的所有正则表达式元字符。var year=parseUri(window.location.search)。queryKey['year'];是一个更相关的例子。上面的例子不适用于parseUri脚本的1.2版本。
字符串yr=location.search.substring(6);
警报(yr);
location.search.split(“year=”)[1]仅在SimpleST中看起来问题已结束,但最新的ans