js中url的对象化管理


声明:本文转载自https://my.oschina.net/yangyishe/blog/1595977,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

(本文中所述的url,指url所有内容构成的字符串;url参数,指url?后面的内容;url纯地址,指url去除参数后的部分)

1.问题描述

url是web编写过程中一种不可或缺的需要打交道的值,不论是在页面跳转中,还是ajax请求数据或是其他框架插件的url提供.
对于很多程序猿来说,js中经常遇到需要变更url(主要是其中所包含的参数)的情况,大多数人使用的方法是直接拼接.
这种方法胜在简单,同样存在不少不足,如:

  1. 拼接形成的url安全性上总是存在潜在的危险;
  2. 从某个完整url中获取其中所包含的参数和纯地址,以进行下一步的比较,也是件较麻烦的事情;

2.解决思路

基于以上问题,我的解决策略是将url进行对象化的管理,将url纯地址,url参数分别放到一个对象的各个属性中.
每次对url的变更,可使用先分析为对象格式,再变更其中某些参数,再组建成为新的url方法.
这样构建再开始做的时候也许会觉得有些多此一举,但在处理一些比较复杂的情况时,会非常方便.


3.演示代码

首先提供分析和组建url的方法(可以考虑将之封装成一个方法,方法称的话可以起的再复杂些以避免重复):

/**  * 数据处理-解析url为一个对象  */ function parseUrl(strUrl){ 	var arrUrlPart=strUrl.split('?'); 	var strUrl=arrUrlPart[0]; 	var mUrl={ 		url:strUrl 	}; 	if(arrUrlPart.length===2){ 		var strParam=arrUrlPart[1]; 		var arrParamPart=strParam.split('&'); 		for(i in arrParamPart){ 			var strParamPart=arrParamPart[i]; 			var arrParamKy=strParamPart.split('='); 			var strKey=arrParamKy[0]; 			var strValue=decodeURIComponent(arrParamKy[1]); 			mUrl[strKey]=strValue; 		} 	} 	return mUrl; } /**  * 数据处理-构成/组建url(字符串)  */ function concatUrl(mUrl){ 	var strUrl=mUrl.url; 	var strParam=''; 	for(strKey in mUrl){ 		if(strKey==='url'||mUrl[strKey]===null) 			continue; 		strParam+=(strKey+'='+encodeURIComponent(mUrl[strKey])+'&');//注入避免 	} 	if(strParam!==''){ 		strParam=('?'+strParam.substring(0,strParam.length-1)); 	} 	return strUrl+strParam; } 

以下是用法示例,当然仅展示了比较简单的情况,可能不能完全体现url对象化管理的威力:

var strUrl1='www.example.com/admin/product/main?group_code=test_group&p_code=shangpin1';  var mUrl1=parseUrl(strUrl1); console.log(mUrl1.p_code);  mUrl1.p_code='shangpin2'; var strUrl2=concatUrl(mUrl1); console.log(strUrl2);  mUrl1.group_code=null; mUrl1.user_name='用?&=户'; var strUrl3=concatUrl(mUrl1); console.log(strUrl3);  var mUrl3=parseUrl(strUrl3); console.log(mUrl3.user_name); 

打印结果为:

shangpin1 www.example.com/admin/product/main?group_code=test_group&p_code=shangpin2 www.example.com/admin/product/main?p_code=shangpin2&user_name=%E7%94%A8%3F%26%3D%E6%88%B7 用?&=户 

以上情况,特别是情况3,可以说将url转换功能使用的非常灵活了.
当然实际在使用的时候,为安全起见,产生一个新的url通常会先创建一个新的对象,而非在原有对象基础上修改.


4.待改进的地方

以上情况适用于非路径参数的情况下,当使用路径参数时,如:

www.example.com/admin/product/list/1 

这个1作为参数,在该方法就不适用了.
也可以优化方法,将方法转化为适用于路径参数的解析与重构,这又是后话了.

本文发表于2017年12月28日 12:32
(c)注:本文转载自https://my.oschina.net/yangyishe/blog/1595977,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1604 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1