从URL中提取参数与将对象转换为URL查询参数的实现代码

 更新时间:2012年01月12日 21:22:34   作者:  
这两种主要是对《Prototype浅析》先前略过的Sring部分中toQueryParams和Object部分的toQueryString方法的补充
一、从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部分,因此上面作了替换。

相关文章

  • js window.event对象详尽解析

    js window.event对象详尽解析

    最近因为工作需要,弄了好多天的js了,老婆一问我在弄 ajax, 一问我在弄js,她都听得没有一点兴趣了,我自己感觉还好,毕竟做出来了东西就有成就感吧,这里把几个有用但是不常见的东西贴出来供大家参考参考
    2009-02-02
  • 小程序实现简单的计算器

    小程序实现简单的计算器

    这篇文章主要为大家详细介绍了小程序实现简单的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • JS动态日期时间的获取方法

    JS动态日期时间的获取方法

    这篇文章主要介绍了js获得当前系统日期时间的方法,涉及javascript操作日期时间的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-09-09
  • electron中获取mac地址的实现示例

    electron中获取mac地址的实现示例

    在基于Electron的应用中,有一个业务需求是获取物理网卡的Mac地址以用于客户机唯一性识别,本文主要介绍了electron中获取mac地址的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 小程序实现计算器功能

    小程序实现计算器功能

    这篇文章主要为大家详细介绍了小程序实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • js无后端实现点击加载查看更多(提示SEO友好度)

    js无后端实现点击加载查看更多(提示SEO友好度)

    为了提示SEO友好度,并且避免调用后端接口给服务器造成负担,可以使用js无后端实现点击加载查看更多,比如HTML中源码存在60条记录,预先显示20条记录,点击“查看更多”一次追加10条,最后一次后按钮文本改为“已查看全部”,在JavaScript中,你可以使用以下步骤来实现
    2024-10-10
  • angular bootstrap timepicker TypeError提示怎么办

    angular bootstrap timepicker TypeError提示怎么办

    这篇文章主要介绍了angular bootstrap timepicker TypeError提示的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • uni-app禁用返回按钮/返回键的具体实现

    uni-app禁用返回按钮/返回键的具体实现

    今天在使用uni-app开发登录页面时遇到一个需求,需要禁用返回按钮,下面这篇文章主要给大家介绍了关于uni-app禁用返回按钮/返回键的具体实现,需要的朋友可以参考下
    2022-11-11
  • JavaScript Map 和 Object 的区别解析

    JavaScript Map 和 Object 的区别解析

    在JavaScript中,Map 和 Object 看起来都是用键值对来存储数据,那么他们有什么不同呢,这篇文章主要介绍了JavaScript Map 和 Object 的区别,需要的朋友可以参考下
    2022-08-08
  • JS实现侧悬浮浮动实例代码

    JS实现侧悬浮浮动实例代码

    这篇文章主要介绍了JS实现侧悬浮浮动实例代码,有需要的朋友可以参考一下
    2013-11-11

最新评论