JavaScript URL参数读取改进版


Posted in Javascript onJanuary 16, 2009

下面是三水点靠木一直也在用的几种方法

<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://3water.com/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'));
Javascript 相关文章推荐
js window.event对象详尽解析
Feb 17 Javascript
JavaScript初学者需要了解10个小技巧
Aug 25 Javascript
javascript实现tabs选项卡切换效果(扩展版)
Mar 19 Javascript
jQuery中 noConflict() 方法使用
Apr 25 Javascript
JavaScript避免代码的重复执行经验技巧分享
Apr 17 Javascript
jquery如何扑捉回车键触发的事件
Apr 24 Javascript
用jquery实现的一个超级简单的下拉菜单
May 18 Javascript
jquery append()方法与html()方法的区别及使用介绍
Aug 01 Javascript
告诉你什么是javascript的回调函数
Sep 04 Javascript
node.js中的fs.writeFileSync方法使用说明
Dec 14 Javascript
jQuery简单实现title提示效果示例
Aug 01 Javascript
vue实现节点增删改功能
Sep 26 Javascript
JavaScript 在线压缩和格式化收藏
Jan 16 #Javascript
解javascript 混淆加密收藏
Jan 16 #Javascript
js 浮动层菜单收藏
Jan 16 #Javascript
jquery中常用的SET和GET
Jan 13 #Javascript
JavaScript 私有成员分析
Jan 13 #Javascript
js利用Array.splice实现Array的insert/remove
Jan 13 #Javascript
JavaScript delete操作符应用实例
Jan 13 #Javascript
You might like
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
vue.js的安装方法
2017/05/12 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
python获取android设备的GPS信息脚本分享
2015/03/06 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
python模块如何查看
2020/06/16 Python
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
企业车辆管理制度
2014/01/24 职场文书
给老师的一封建议书
2014/03/13 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
生物科学专业自荐书
2014/06/20 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
总经理年会致辞
2015/07/29 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
护理自荐信
2019/05/14 职场文书
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS