从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中如何处理引号编码&amp;#034;
Aug 15 Javascript
深入理解javascript的执行顺序
Apr 04 Javascript
JS合并数组的几种方法及优劣比较
Sep 19 Javascript
JavaScript修改浏览器tab标题小技巧
Jan 06 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
Sep 14 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
Sep 15 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
JavaScript中数组的22种方法必学(推荐)
Jul 20 Javascript
AngularJS中实现动画效果的方法
Jul 28 Javascript
ES6新特征数字、数组、字符串
Oct 01 Javascript
js 只比较时间大小的实例
Oct 26 Javascript
用JS创建一个录屏功能
Nov 11 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
360通用php防护代码(使用操作详解)
2013/06/18 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
2014/01/16 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
详解python Todo清单实战
2018/11/01 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
pycharm新建一个python工程步骤
2019/07/16 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
戴尔英国官网:Dell英国
2017/05/27 全球购物
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
护理专科毕业自荐信范文
2014/04/21 职场文书
课外小组活动总结
2014/08/27 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers