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 相关文章推荐
jQuery侧边栏随窗口滚动实现方法
Mar 04 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
May 08 Javascript
js 判断浏览器使用的语言示例代码
Mar 22 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
JS获取当前脚本文件的绝对路径
Mar 02 Javascript
jQuery中的each()详细介绍(推荐)
May 25 Javascript
JS简单实现数组去重的方法示例
Mar 27 Javascript
在React中如何优雅的处理事件响应详解
Jul 24 Javascript
详解Angular4 路由设置相关
Aug 26 Javascript
JavaScript函数节流和函数去抖知识点学习
Jul 31 Javascript
基于layui table返回的值的多级嵌套的解决方法
Sep 19 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
May 28 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
PHP中for循环语句的几种变型
2007/03/16 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
js date 格式化
2017/02/15 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Android分包MultiDex策略详解
2017/10/30 Python
python 以16进制打印输出的方法
2018/07/09 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
python 杀死自身进程的实现方法
2019/07/01 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
python super函数使用方法详解
2020/02/14 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
致1500米运动员广播稿
2014/02/07 职场文书
高考备战决心书
2014/03/11 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
工作年限证明范本
2015/06/15 职场文书
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers