从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 相关文章推荐
jQuery ajax(复习)—Baidu ajax request分离版
Jan 24 Javascript
JavaScript将页面表格导出为Excel的具体实现
Dec 27 Javascript
javascript 小数取整简单实现方式
May 30 Javascript
Bootstrap作品展示站点实战项目2
Oct 14 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 Javascript
Vue非父子组件通信详解
Jun 12 Javascript
ES6/JavaScript使用技巧分享
Dec 14 Javascript
手动下载Chrome并解决puppeteer无法使用问题
Nov 12 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
Sep 27 Javascript
vue从零实现一个消息通知组件的方法详解
Mar 16 Javascript
Vue中使用JsonView来展示Json树的实例代码
Nov 16 Javascript
Vue 组件注册全解析
Dec 17 Vue.js
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中使用模板的方法
2008/05/24 PHP
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
Array.prototype.slice 使用扩展
2010/06/09 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
python多重继承实例
2014/10/11 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
利用python循环创建多个文件的方法
2018/10/25 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
Python文件路径名的操作方法
2019/10/30 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
鲜果饮品店创业计划书
2014/01/21 职场文书
娱乐节目策划方案
2014/06/10 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
西柏坡观后感
2015/06/08 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
七年级作文之环保作文
2019/10/17 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python