从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 出生日期和身份证判断大全
Nov 13 Javascript
JS获取当前网页大小以及屏幕分辨率等
Sep 05 Javascript
分析了一下JQuery中的extend方法实现原理
Feb 27 Javascript
js实现新年倒计时效果
Dec 10 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
javascript每日必学之多态
Feb 23 Javascript
微信小程序中实现一对多发消息详解及实例代码
Feb 14 Javascript
JavaScript设计模式之调停者模式实例详解
Feb 03 Javascript
Node.js原生api搭建web服务器的方法步骤
Feb 15 Javascript
简述vue-cli中chainWebpack的使用方法
Jul 30 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
Sep 28 Javascript
viewer.js实现图片预览功能
Jun 24 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
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
PHP面向对象精要总结
2014/11/07 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
Script的加载方法小结
2011/01/12 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
详解python分布式进程
2018/10/08 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
解决python3输入的坑——input()
2020/12/05 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
学生学习总结的自我评价
2013/10/22 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
艺术教育实施方案
2014/05/03 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书