JavaScript URL参数读取改进版

 更新时间:2009年01月16日 20:57:03   作者:  
此前发表的那一版确实能不用循环,但是总用正则表达式的替换,不一定比用循环提高性能,而且把程序搞得有些太复杂了。从《JavaScript权威指南》上学到的范例如下

下面是脚本之家一直也在用的几种方法

复制代码 代码如下:

<script language="javascript" type="text/javascript">
function request(paras){
var url = location.href;
var paraString = url.substring(url.indexOf("?")+1,url.length).split("&");
var paraObj = {}
for (i=0; j=paraString[i]; i++){
paraObj[j.substring(0,j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=")+1,j.length);
}
var returnValue = paraObj[paras.toLowerCase()];
if(typeof(returnValue)=="undefined"){
return "";
}else{
return returnValue;
}
}
//下面是应用代码
var theurl
theurl=request("url");
if (theurl!=''){
location=theurl
}
</script>

下面是正则函数
用Javascript正则实现url链接的解析类
https://www.jb51.net/article/15000.htm

下面的代码有点乱
/* 《JavaScript权威指南》介绍的更简洁的取 URL 参数的方法,不用正则表达式,用一次循环。一次性返回一个对象的好处是只需要调用一次此函数,参数和值对可以存在一个对象里,以后再取其它参数的值就不用再调用此函数了,只要取对象的属性就行了。
复制代码 代码如下:

* 用法:
* var args = getArgs( ); // 从 URL 解析出参数
* var q = args.q || ""; // 如果定义了某参数,则使用其值,否则给它一个默认值
* var n = args.n ? parseInt(args.n) : 10;
*/
var getArgs = function ()
{
var args = new Object( ); //声明一个空对象
var query = window.location.search.substring(1); // 取查询字符串,如从 http://www.snowpeak.org/testjs.htm?a1=v1&a2=&a3=v3#anchor 中截出 a1=v1&a2=&a3=v3。
var pairs = query.split("&"); // 以 & 符分开成数组
for(var i = 0; i < pairs.length; i++) {
var pos = pairs[i].indexOf('='); // 查找 "name=value" 对
if (pos == -1) continue; // 若不成对,则跳出循环继续下一对
var argname = pairs[i].substring(0,pos); // 取参数名
var value = pairs[i].substring(pos+1); // 取参数值
value = decodeURIComponent(value); // 若需要,则解码
args[argname] = value; // 存成对象的一个属性
}
return args; // 返回此对象
}

它的突出优点就是程序只用执行一次提取操作,以后再重复取参数值,都不用再执行程序了。取 URL 参数还是这样比较简便易行,又好理解。

下面是我此前发表的“不用循环”但“有些太复杂”的版本:
复制代码 代码如下:

//不用循环纯用正则实现从 URL 中取参数的值。取代循环的核心技术是字符串的 replace() 方法可以用函数作第二参数,按用户定义的方式去替换。
//若有此参数名但无值,则返回空字符串;若无此参数名,返回 undefined。
var getArg = function(argname)
{
var str = location.href;
var submatch;
//先从 URL 中取出问号和井口与之间的查询字符串,如从 http://www.snowpeak.org/testjs.htm?a1=v1&a2=&a3=v3#anchor 中截出 a1=v1&a2=&a3=v3。
//问号是模式的特殊字符,所以要写成 \?;井号可有可无,所以模式结尾是 #?
if (submatch = str.match(/\?([^#]*)#?/))
{
//取到捕捉的子匹配形如 a1=v1&a2=&a3=v3,在前面加个 & 做成规则的 &a1=v1&a2=&a3=v3 便于下一步替换
var argstr = '&'+submatch[1];
//做个替换用的函数,把找到的每组形如 &a1=v1 替换成 a1:"v1", 这样的对象定义用的属性声明
var returnPattern = function(str)
{
//$1 和 $2 代表捕捉到的第1个和第2个子匹配,必须用在字符串里
return str.replace(/&([^=]+)=([^&]*)/, '$1:"$2",');
}
//执行一个全局的正则替换,第二参数就是刚才定义的替换函数,把 a1=v1&a2=&a3=v3 替换成 a1:"v1",a2:"",a3:"v3",
argstr = argstr.replace(/&([^=]+)=([^&]*)/g, returnPattern);
//最后再执行一个对象的声明,需要形如 var retvalue = {a1:"v1",a2:"",a3:"v3"}; 的对象声明,而刚才替换完的字符串结尾还有个逗号,把结尾的逗号用 substr 截掉即可
eval('var retvalue = {'+argstr.substr(0, argstr.length-1)+'};');
//现在就得到了一个对象,URL 中每个参数名是其属性名,参数值是对应的属性值
return retvalue[argname];
}
}

//测试
document.write('a1='+getArg('a1')+', a2='+getArg('a2')+', a3='+getArg('a3'));

相关文章

  • js中split()方法得到的数组长度问题

    js中split()方法得到的数组长度问题

    split() 方法用于把一个字符串分割成字符串数组。这篇文章给大家介绍js中split()方法得到的数组长度问题,感兴趣的朋友一起看看吧
    2018-07-07
  • js onclick事件传参讲解

    js onclick事件传参讲解

    本文是对js中的onclick事件传参进行了详细的讲解,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • 详解小程序如何改变onLoad的执行时机

    详解小程序如何改变onLoad的执行时机

    这篇文章主要介绍了详解小程序如何改变onLoad的执行时机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • js 动态创建 html元素

    js 动态创建 html元素

    最近在学习js 写了个简单的效果,菜鸟可以学习学习,基本原理:使用随即数设置top 和left的值,
    2009-07-07
  • JS生成登录验证码的实现示例

    JS生成登录验证码的实现示例

    本文主要介绍了JS生成登录验证码的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • layui点击弹框页面 表单请求的方法

    layui点击弹框页面 表单请求的方法

    今天小编就为大家分享一篇layui点击弹框页面 表单请求的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • TypeScript使用vscode监视代码编译的过程

    TypeScript使用vscode监视代码编译的过程

    这篇文章主要介绍了TypeScript使用vscode监视代码编译,使用tsc 文件名称可以将ts文件转化为js文件,js文件可以引入在html文件中直接使用,需要的朋友可以参考下
    2021-12-12
  • 小程序点餐界面添加购物车左右摆动动画

    小程序点餐界面添加购物车左右摆动动画

    这篇文章主要介绍了小程序点餐界面添加购物车左右摆动动画,当用户点击添加到购物车后会有一个左右摆动的购物车提示效果,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • JS获取键盘上任意按键的值(实例代码)

    JS获取键盘上任意按键的值(实例代码)

    JS获取键盘上任意按键值的实例代码。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • JavaScript中innerHTML,innerText,outerHTML的用法及区别

    JavaScript中innerHTML,innerText,outerHTML的用法及区别

    在javascript中如果我们要获取对象内容,js为我们提供了三种方法outerhtml、innerhtml和innertext,但他们之间具体怎么使用与具体的区别在哪里,可能很多人不知道吧,接下来跟着小编一起来学习innerHTML,innerText,outerHTML的用法及区别吧。
    2015-09-09

最新评论