从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中的有名函数和无名函数
Oct 17 Javascript
Prototype Object对象 学习
Jul 12 Javascript
javaScript实现浮点数转十六进制字符
Oct 29 Javascript
js 自动播放的实例代码
Nov 19 Javascript
JS嵌套函数调用上下文的问题解决
Mar 26 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
JavaScript的jQuery库中function的存在和参数问题
Aug 13 Javascript
如何用js实现鼠标向上滚动时浮动导航
Jul 18 Javascript
基于JS实现的随机数字抽签实例
Dec 08 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
Three.js中矩阵和向量的使用教程
Mar 19 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 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
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
什么是MVC,好东西啊
2007/05/03 PHP
php xml文件操作实现代码(二)
2009/03/20 PHP
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
JS 字符串连接[性能比较]
2009/05/10 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
jQuery包裹节点用法完整示例
2016/09/13 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
python实现单向链表详解
2018/02/08 Python
python实现linux下抓包并存库功能
2018/07/18 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
项目经理岗位职责
2013/11/11 职场文书
客服专员岗位职责范本
2013/11/29 职场文书
法学专业自我鉴定
2014/02/05 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
具结保证书范本
2015/05/11 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
Python 数据可视化之Seaborn详解
2021/11/02 Python