从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 相关文章推荐
js的hasownproperty使用示例
Mar 02 Javascript
使用JS取得焦点(focus)元素代码
Mar 22 Javascript
javascript实现的HashMap类代码
Jun 27 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 Javascript
switch语句的妙用(必看篇)
Oct 03 Javascript
基于Layer+jQuery的自定义弹框
May 26 Javascript
canvas 绘制圆形时钟
Feb 22 Javascript
详解angularJs指令的3种绑定策略
Apr 13 Javascript
JS实现随机生成10个手机号的方法示例
Dec 07 Javascript
优化Vue项目编译文件大小的方法步骤
May 27 Javascript
layui 地区三级联动 form select 渲染的实例
Sep 27 Javascript
vue实例的选项总结
Jun 09 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探针使用原理和技巧讲解
2019/09/17 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
js写的评论分页(还不错)
2013/12/23 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
JavaScript中string对象
2015/06/12 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
详解Django通用视图中的函数包装
2015/07/21 Python
Python入门之三角函数sin()函数实例详解
2017/11/08 Python
Python与R语言的简要对比
2017/11/14 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
python调用支付宝支付接口流程
2019/08/15 Python
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
navabi英国:设计师大码女装
2019/06/25 全球购物
党员公开承诺事项
2014/03/25 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
会计主管岗位职责
2015/04/02 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
小学生暑假安全公约
2015/07/14 职场文书
python如何正确使用yield
2021/05/21 Python
详解Vue3使用axios的配置教程
2022/04/29 Vue.js