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 相关文章推荐
菜鸟javascript基础资料整理3 正则
Dec 06 Javascript
Javascript查询DBpedia小应用实例学习
Mar 07 Javascript
javascript实现yield的方法
Nov 06 Javascript
jQuery实现简单下拉导航效果
Sep 07 Javascript
ES5学习教程之Array对象
Apr 01 Javascript
微信小程序自定义导航隐藏和显示功能
Jun 13 Javascript
node.js中grunt和gulp的区别详解
Jul 17 Javascript
AngularJS 仿微信图片手势缩放的实例
Sep 28 Javascript
微信小程序CSS3动画下拉菜单效果
Nov 04 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
Aug 27 Javascript
Layui Form 自定义验证的实例代码
Sep 14 Javascript
JS+CSS实现过渡特效
Jan 02 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
2017/08/15 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
Python3中exp()函数用法分析
2019/02/19 Python
Python读写文件基础知识点
2019/06/10 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
html5使用canvas画一条线
2014/12/15 HTML / CSS
大学生村官心得体会范文
2014/01/04 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
python实现简单倒计时功能
2021/04/21 Python
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
MySQL中varchar和char类型的区别
2021/11/17 MySQL