從URL中提取參數(shù)與將對象轉(zhuǎn)換為URL查詢參數(shù)的實現(xiàn)代碼
更新時間:2012年01月12日 21:22:34 作者:
這兩種主要是對《Prototype淺析》先前略過的Sring部分中toQueryParams和Object部分的toQueryString方法的補充
一、從URL中提取參數(shù)
有下列字符串:
var linkURL = 'http://localhost:8080/String/string_6.html?昵稱=小西山子&age=24#id1';
對于一個真實的URL地址,可以用js來讀取location中的相關(guān)信息來獲得某些信息,下面列舉一些:
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【協(xié)議】
其中,與從URL中提取參數(shù)主要是用到location.search。不過為了通用,我們不去讀取location.search,直接處理字符串。
提取字符串查詢字符串之后,轉(zhuǎn)化為對象的形式。
先討論幾種查詢字符串的情況:
(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++){ //這里可以調(diào)用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的實現(xiàn),上面又一個步驟是用'='分割參數(shù),然后在value中再拼接。另外可以用substring來實現(xiàn):
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));
一、對象轉(zhuǎn)換為URL查詢參數(shù)
對象轉(zhuǎn)換為URL查詢參數(shù)就麻煩一點。不過由于是轉(zhuǎn)換成查詢參數(shù)形式,因此只能處理單層嵌套的對象,子對象就不能處理了。其原理就是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){//數(shù)組
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部分,因此上面作了替換。
有下列字符串:
var linkURL = 'http://localhost:8080/String/string_6.html?昵稱=小西山子&age=24#id1';
對于一個真實的URL地址,可以用js來讀取location中的相關(guān)信息來獲得某些信息,下面列舉一些:
復(fù)制代碼 代碼如下:
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【協(xié)議】
其中,與從URL中提取參數(shù)主要是用到location.search。不過為了通用,我們不去讀取location.search,直接處理字符串。
提取字符串查詢字符串之后,轉(zhuǎn)化為對象的形式。
先討論幾種查詢字符串的情況:
(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']}
復(fù)制代碼 代碼如下:
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++){ //這里可以調(diào)用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的實現(xiàn),上面又一個步驟是用'='分割參數(shù),然后在value中再拼接。另外可以用substring來實現(xiàn):
復(fù)制代碼 代碼如下:
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));
一、對象轉(zhuǎn)換為URL查詢參數(shù)
對象轉(zhuǎn)換為URL查詢參數(shù)就麻煩一點。不過由于是轉(zhuǎn)換成查詢參數(shù)形式,因此只能處理單層嵌套的對象,子對象就不能處理了。其原理就是toQueryParams的反向操作。
復(fù)制代碼 代碼如下:
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){//數(shù)組
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部分,因此上面作了替換。
相關(guān)文章
利用javascript實現(xiàn)禁用網(wǎng)頁上所有文本框,下拉菜單,多行文本域
這篇文章主要介紹了利用javascript實現(xiàn)禁用網(wǎng)頁上所有文本框,下拉菜單,多行文本域。需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12javascript中的toFixed固定小數(shù)位數(shù) 簡單實例分享
這篇文章介紹了toFixed固定小數(shù)位數(shù)的簡單例子,有需要的朋友可以參考一下2013-07-07JavaScript動態(tài)創(chuàng)建form表單并提交的實現(xiàn)方法
這篇文章主要介紹了JavaScript動態(tài)創(chuàng)建form表單并提交的實現(xiàn)方法,涉及JavaScript動態(tài)創(chuàng)建頁面元素及模擬表單提交的技巧,需要的朋友可以參考下2015-12-12javaScript 數(shù)值型和字符串型之間的轉(zhuǎn)換
javaScript 數(shù)值型和字符串型之間的轉(zhuǎn)換2009-07-07js利用appendChild對<li>標(biāo)簽進行排序的實現(xiàn)方法
下面小編就為大家?guī)硪黄猨s利用appendChild對<li>標(biāo)簽進行排序的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10javascritp添加url參數(shù)將參數(shù)加入到url中
javascritp添加url參數(shù)方法,將參數(shù)加入到url中,如果原來url中有則覆蓋,下面是示例代碼,感興趣的朋友可以參考下2014-09-09理解javascript中try...catch...finally
這篇文章主要幫助大家理解javascript中try...catch...finally,從淺入深,一步步掌握javascript中try...catch...finally的使用方法,感興趣的小伙伴們可以參考一下2015-12-12