JavaScript URL參數讀取改進版_javascript技巧

來源:互聯網
上載者:User

下面是雲棲社區一直也在用的幾種方法

複製代碼 代碼如下:

<script language="javascript" type="text/javascript">
function request(paras){
var url = location.href;
var paraString = url.substring(url.indexOf("?")+1,url.length).split("&");
var paraObj = {}
for (i=0; j=paraString[i]; i++){
paraObj[j.substring(0,j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=")+1,j.length);
}
var returnValue = paraObj[paras.toLowerCase()];
if(typeof(returnValue)=="undefined"){
return "";
}else{
return returnValue;
}
}
//下面是應用代碼
var theurl
theurl=request("url");
if (theurl!=''){
location=theurl
}
</script>

下面是正則函數
用Javascript正則實現url連結的解析類
http://www.jb51.net/article/15000.htm

下面的代碼有點亂
/* 《JavaScript權威指南》介紹的更簡潔的取 URL 參數的方法,不用Regex,用一次迴圈。一次性返回一個對象的好處是只需要調用一次此函數,參數和值對可以存在一個對象裡,以後再取其它參數的值就不用再調用此函數了,只要取對象的屬性就行了。
複製代碼 代碼如下:

* 用法:
* var args = getArgs( ); // 從 URL 解析出參數
* var q = args.q || ""; // 如果定義了某參數,則使用其值,否則給它一個預設值
* var n = args.n ? parseInt(args.n) : 10;
*/
var getArgs = function ()
{
var args = new Object( ); //聲明一個Null 物件
var query = window.location.search.substring(1); // 取查詢字串,如從 http://www.snowpeak.org/testjs.htm?a1=v1&a2=&a3=v3#anchor 中截出 a1=v1&a2=&a3=v3。
var pairs = query.split("&"); // 以 & 符分開成數組
for(var i = 0; i < pairs.length; i++) {
var pos = pairs[i].indexOf('='); // 尋找 "name=value" 對
if (pos == -1) continue; // 若不成對,則跳出迴圈繼續下一對
var argname = pairs[i].substring(0,pos); // 取參數名
var value = pairs[i].substring(pos+1); // 取參數值
value = decodeURIComponent(value); // 若需要,則解碼
args[argname] = value; // 存成對象的一個屬性
}
return args; // 返回此對象
}

它的突出優點就是程式只用執行一次提取操作,以後再重複取參數值,都不用再執行程式了。取 URL 參數還是這樣比較簡便易行,又好理解。

下面是我此前發表的“不用迴圈”但“有些太複雜”的版本:
複製代碼 代碼如下:

//不用迴圈純用正則實現從 URL 中取參數的值。取代迴圈的核心技術是字串的 replace() 方法可以用函數作第二參數,按使用者定義的方式去替換。
//若有此參數名但無值,則返回Null 字元串;若無此參數名,返回 undefined。
var getArg = function(argname)
{
var str = location.href;
var submatch;
//先從 URL 中取出問號和井口與之間的查詢字串,如從 http://www.snowpeak.org/testjs.htm?a1=v1&a2=&a3=v3#anchor 中截出 a1=v1&a2=&a3=v3。
//問號是模式的特殊字元,所以要寫成 \?;井號可有可無,所以模式結尾是 #?
if (submatch = str.match(/\?([^#]*)#?/))
{
//取到捕捉的子匹配形如 a1=v1&a2=&a3=v3,在前面加個 & 做成規則的 &a1=v1&a2=&a3=v3 便於下一步替換
var argstr = '&'+submatch[1];
//做個替換用的函數,把找到的每組形如 &a1=v1 替換成 a1:"v1", 這樣的對象定義用的屬性聲明
var returnPattern = function(str)
{
//$1 和 $2 代表捕捉到的第1個和第2個子匹配,必須用在字串裡
return str.replace(/&([^=]+)=([^&]*)/, '$1:"$2",');
}
//執行一個全域的正則替換,第二參數就是剛才定義的替換函數,把 a1=v1&a2=&a3=v3 替換成 a1:"v1",a2:"",a3:"v3",
argstr = argstr.replace(/&([^=]+)=([^&]*)/g, returnPattern);
//最後再執行一個對象的聲明,需要形如 var retvalue = {a1:"v1",a2:"",a3:"v3"}; 的對象聲明,而剛才替換完的字串結尾還有個逗號,把結尾的逗號用 substr 截掉即可
eval('var retvalue = {'+argstr.substr(0, argstr.length-1)+'};');
//現在就得到了一個對象,URL 中每個參數名是其屬性名稱,參數值是對應的屬性值
return retvalue[argname];
}
}

//測試
document.write('a1='+getArg('a1')+', a2='+getArg('a2')+', a3='+getArg('a3'));

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.