从URL中提取参数与将对象转换为URL查询参数的实现代码


Posted in Javascript onJanuary 12, 2012

一、从URL中提取参数

有下列字符串:

var linkURL = 'http://localhost:8080/String/string_6.html?昵称=小西山子&age=24#id1';
对于一个真实的URL地址,可以用js来读取location中的相关信息来获得某些信息,下面列举一些:

location.origin : http://localhost【域】 
location.pathname : /project_js/Javascript/js_basic/demo/String/string_6.html【URL路径】 
location.host : localhost【主机+端口】 
location.hostname : localhost【主机名】 
location.port :【端口】 
location.search : ?name=xesam【查询字符串】 
location.hash : #age【锚点】 
location.href : http://localhost/project_js/Javascript/js_basic/demo/String/string_6.html?name=xesam#age【完整形式】 
location.protocol : http【协议】

其中,与从URL中提取参数主要是用到location.search。不过为了通用,我们不去读取location.search,直接处理字符串。

提取字符串查询字符串之后,转化为对象的形式。

先讨论几种查询字符串的情况:

(1)?昵称=小西山子&age=24#id1 -->{昵称:'小西山子',age:'24'}

(2)?昵称&age=24#id1'; -->{昵称:undefined,age:'24'}

(3)?=小西山子&age=24#id1 -->{age:'24'}

(4)?昵称=小西山子=又一个&age=24&age=24#id1 -->{昵称:'小西山子=又一个',age:['24','24']}

function toQueryParams(){ 
var search = this.replace(/^\s+/,'').replace(/\s+$/,'').match(/([^?#]*)(#.*)?$/);//提取location.search中'?'后面的部分 
if(!search){ 
return {}; 
} 
var searchStr = search[1]; 
var searchHash = searchStr.split('&'); var ret = {}; 
for(var i = 0, len = searchHash.length; i < len; i++){ //这里可以调用each方法 
var pair = searchHash[i]; 
if((pair = pair.split('='))[0]){ 
var key = decodeURIComponent(pair.shift()); 
var value = pair.length > 1 ? pair.join('=') : pair[0]; 
console.log() 
if(value != undefined){ 
value = decodeURIComponent(value); 
} 
if(key in ret){ 
if(ret[key].constructor != Array){ 
ret[key] = [ret[key]]; 
} 
ret[key].push(value); 
}else{ 
ret[key] = value; 
} 
} 
} 
return ret; 
} 
console.dir(toQueryParams.call(linkURL));

上面基本就是Prototype中toQueryParams的实现,上面又一个步骤是用'='分割参数,然后在value中再拼接。另外可以用substring来实现:
function toQueryParams(){ 
var search = this.replace(/^\s+/,'').replace(/\s+$/,'').match(/([^?#]*)(#.*)?$/); 
if(!search){ 
return {}; 
} 
var searchStr = search[1]; 
var searchHash = searchStr.split('&'); var ret = {}; 
searchHash.forEach(function(pair){ 
var temp = ''; 
if(temp = (pair.split('=',1))[0]){ 
var key = decodeURIComponent(temp); 
var value = pair.substring(key.length + 1); 
if(value != undefined){ 
value = decodeURIComponent(value); 
} 
if(key in ret){ 
if(ret[key].constructor != Array){ 
ret[key] = [ret[key]]; 
} 
ret[key].push(value); 
}else{ 
ret[key] = value; 
} 
} 
}); 
return ret; 
} 
console.dir(toQueryParams.call(linkURL));

一、对象转换为URL查询参数

对象转换为URL查询参数就麻烦一点。不过由于是转换成查询参数形式,因此只能处理单层嵌套的对象,子对象就不能处理了。其原理就是toQueryParams的反向操作。

function toQueryPair(key, value) { 
if (typeof value == 'undefined'){ 
return key; 
} 
return key + '=' + encodeURIComponent(value === null ? '' : String(value)); 
} 
function toQueryString(obj) { 
var ret = []; 
for(var key in obj){ 
key = encodeURIComponent(key); 
var values = obj[key]; 
if(values && values.constructor == Array){//数组 
var queryValues = []; 
for (var i = 0, len = values.length, value; i < len; i++) { 
value = values[i]; 
queryValues.push(toQueryPair(key, value)); 
} 
ret = ret.concat(queryValues); 
}else{ //字符串 
ret.push(toQueryPair(key, values)); 
} 
} 
return ret.join('&'); 
} 
console.log(toQueryString({ 
name : 'xesam', 
age : 24 
})); //name=xesam&age=24 
console.log(toQueryString({ 
name : 'xesam', 
age : [24,25,26] 
})); //name=xesam&age=24&age=25&age=26

真实源码中用的是inject方法,不过在Enumerable部分,因此上面作了替换。
Javascript 相关文章推荐
Javascript结合css实现网页换肤功能
Nov 02 Javascript
js报$ is not a function 的问题的解决方法
Jan 20 Javascript
jQuery拖拽插件gridster使用指南
Apr 21 Javascript
js常用DOM方法详解
Feb 04 Javascript
Vue组件通信实践记录(推荐)
Aug 15 Javascript
ES6关于Promise的用法详解
May 07 Javascript
浅谈vue项目打包优化策略
Sep 29 Javascript
JavaScript 预解析的4种实现方法解析
Sep 03 Javascript
VUE 动态组件的应用案例分析
Dec 02 Javascript
谈谈node.js中的模块系统
Sep 01 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
Sep 02 Javascript
js调用网络摄像头的方法
Dec 05 Javascript
js中根据字数截取字符串,不能截断url
Jan 12 #Javascript
js 实现css风格选择器(压缩后2KB)
Jan 12 #Javascript
js日历功能对象
Jan 12 #Javascript
关于 文本框默认值 的操作js代码
Jan 12 #Javascript
新发现一个骗链接的方法(js读取cookies)
Jan 11 #Javascript
JS读取cookies信息(记录用户名)
Jan 10 #Javascript
判断对象是否Window的实现代码
Jan 10 #Javascript
You might like
PHP编程风格规范分享
2014/01/15 PHP
使用PHP破解防盗链图片的一个简单方法
2014/06/07 PHP
PHP会话处理的10个函数
2015/08/11 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
jquery遍历checkbox介绍
2014/02/21 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
python实现类之间的方法互相调用
2018/04/29 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
产品售后服务承诺书
2014/05/21 职场文书
我是一名护士演讲稿
2014/08/28 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
优秀班组申报材料
2014/12/25 职场文书
体育教师个人工作总结
2015/02/09 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
python如何正确使用yield
2021/05/21 Python
Python机器学习之决策树和随机森林
2021/07/15 Javascript
mysql事务隔离级别详情
2021/10/24 MySQL
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫