js中url對(duì)象化管理分析
1.問(wèn)題描述
url是web編寫(xiě)過(guò)程中一種不可或缺的需要打交道的值,不論是在頁(yè)面跳轉(zhuǎn)中,還是ajax請(qǐng)求數(shù)據(jù)或是其他框架插件的url提供.
對(duì)于很多程序猿來(lái)說(shuō),js中經(jīng)常遇到需要變更url(主要是其中所包含的參數(shù))的情況,大多數(shù)人使用的方法是直接拼接.
這種方法勝在簡(jiǎn)單,同樣存在不少不足,如:
拼接形成的url安全性上總是存在潛在的危險(xiǎn);
從某個(gè)完整url中獲取其中所包含的參數(shù)和純地址,以進(jìn)行下一步的比較,也是件較麻煩的事情;
2.解決思路
基于以上問(wèn)題,我的解決策略是將url進(jìn)行對(duì)象化的管理,將url純地址,url參數(shù)分別放到一個(gè)對(duì)象的各個(gè)屬性中.
每次對(duì)url的變更,可使用先分析為對(duì)象格式,再變更其中某些參數(shù),再組建成為新的url方法.
這樣構(gòu)建再開(kāi)始做的時(shí)候也許會(huì)覺(jué)得有些多此一舉,但在處理一些比較復(fù)雜的情況時(shí),會(huì)非常方便.
3.演示代碼
首先提供分析和組建url的方法(可以考慮將之封裝成一個(gè)方法,方法稱的話可以起的再?gòu)?fù)雜些以避免重復(fù)):
/**
* 數(shù)據(jù)處理-解析url為一個(gè)對(duì)象
*/
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;
}
/**
* 數(shù)據(jù)處理-構(gòu)成/組建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;
}
以下是用法示例,當(dāng)然僅展示了比較簡(jiǎn)單的情況,可能不能完全體現(xiàn)url對(duì)象化管理的威力:
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);
打印結(jié)果為:
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,可以說(shuō)將url轉(zhuǎn)換功能使用的非常靈活了.
當(dāng)然實(shí)際在使用的時(shí)候,為安全起見(jiàn),產(chǎn)生一個(gè)新的url通常會(huì)先創(chuàng)建一個(gè)新的對(duì)象,而非在原有對(duì)象基礎(chǔ)上修改.
4.待改進(jìn)的地方
以上情況適用于非路徑參數(shù)的情況下,當(dāng)使用路徑參數(shù)時(shí),如:
www.example.com/admin/product/list/1
這個(gè)1作為參數(shù),在該方法就不適用了.
也可以優(yōu)化方法,將方法轉(zhuǎn)化為適用于路徑參數(shù)的解析與重構(gòu),這又是后話了。
以上就是我們給大家詳細(xì)介紹的關(guān)于JS中URL對(duì)象化管理的全部?jī)?nèi)容,感謝你對(duì)腳本之家的支持。
相關(guān)文章
數(shù)據(jù)庫(kù)管理工具PHPMyAdmin
這篇文章主要為大家介紹了數(shù)據(jù)庫(kù)管理工具PHPMyAdmin使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
knockoutjs動(dòng)態(tài)加載外部的file作為component中的template數(shù)據(jù)源的實(shí)現(xiàn)方法
Knockoutjs 的Components 是一種自定義的組件,它以一種強(qiáng)大、簡(jiǎn)介的方式將你自己的ui代碼組織成一種單獨(dú)的、可重用的模塊。接下來(lái)通過(guò)本文給大家介紹knockoutjs動(dòng)態(tài)加載外部的file作為component中的template數(shù)據(jù)源的實(shí)現(xiàn)方法,一起看看吧2016-09-09
通過(guò)偽協(xié)議解決父頁(yè)面與iframe頁(yè)面通信的問(wèn)題
這篇文章主要介紹了通過(guò)偽協(xié)議解決父頁(yè)面與iframe頁(yè)面通信的問(wèn)題,需要的朋友可以參考下2015-04-04
微信小程序中上傳圖片并進(jìn)行壓縮的實(shí)現(xiàn)代碼
這篇文章主要介紹了微信小程序中上傳圖片并進(jìn)行壓縮的實(shí)現(xiàn)代碼,文中提到了上傳圖片并進(jìn)行壓縮的屬性值,需要的朋友可以參考下2018-08-08
JavaScript使用DeviceOne開(kāi)發(fā)實(shí)戰(zhàn)(一) 配置和起步
這篇文章主要介紹了JavaScript使用DeviceOne開(kāi)發(fā)實(shí)戰(zhàn)(一) 配置和起步的相關(guān)資料,需要的朋友可以參考下2015-12-12
利用Axios實(shí)現(xiàn)無(wú)感知雙Token刷新的詳細(xì)教程
在現(xiàn)代系統(tǒng)中,Token認(rèn)證已成為保障用戶安全的標(biāo)準(zhǔn)做法,然而,盡管許多系統(tǒng)采用了這種認(rèn)證方式,卻在處理Token刷新方面存在不足,導(dǎo)致用戶體驗(yàn)不佳,許多系統(tǒng)未能提供一種無(wú)縫的、用戶無(wú)感知的Token刷新機(jī)制,所以本文介紹了教你用Axios實(shí)現(xiàn)無(wú)感知雙Token刷新2024-08-08
Bootstrap布局之柵格系統(tǒng)學(xué)習(xí)筆記
這篇文章主要為大家詳細(xì)介紹了Bootstrap布局之柵格系統(tǒng)的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05

