从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之卸载鼠标事件的代码
May 14 Javascript
封装的原生javascript弹出层代码
Sep 24 Javascript
精通Javascript系列之数据类型 字符串
Jun 08 Javascript
JavaScript中json对象和string对象之间相互转化
Dec 26 Javascript
JS使用getComputedStyle()方法获取CSS属性值
Apr 23 Javascript
javascript实现图片跟随鼠标移动效果的方法
May 13 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
Jun 12 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
Jun 04 Javascript
微信小程序实现tab切换效果
Nov 21 Javascript
vue项目常用组件和框架结构介绍
Dec 24 Javascript
浅谈node模块与npm包管理工具
Jan 03 Javascript
Javascript Web Worker使用过程解析
Mar 16 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
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
JS面向对象编程之对象使用分析
2010/08/19 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
Python 中的with关键字使用详解
2016/09/11 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
python操作文件的参数整理
2019/06/11 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
大三在校生电子商务求职信
2013/10/29 职场文书
科级干部考察材料
2014/02/15 职场文书
法人代表证明书格式
2014/10/01 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
婚礼家长致辞
2015/07/27 职场文书
员工安全责任协议书
2016/03/22 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技