JS 文件傳參及處理技巧分析
更新時間:2010年05月13日 17:32:53 作者:
其實(shí)為js文件傳參是很久就接觸過的一個問題,只是一直沒有放在心上,今天在無憂看到又有人問這個問題,今日總結(jié)一下。
解決思路:
1、首先獲取到當(dāng)前JS文件的SRC屬性,這里有一個小技巧:我們只需要獲取當(dāng)前頁面最后一個script標(biāo)記內(nèi)容即可。
為什么??因?yàn)镴S是順序解析的,當(dāng)前JS腳本解析時后面的js都還沒有解析到,當(dāng)然就認(rèn)為自己就是最后一個script了。此外,這樣獲取還有一個好處:我們可以多次引用同一個文件且傳入不同的參數(shù),這樣可以在js文件中根據(jù)參數(shù)不同做不同處理,很巧妙把!簡直就是動態(tài)語言了。
代碼如下:
var scripts=document.getElementsByTagName("script");
var curJS=scripts[scripts.length-1]; //curJS就是我們當(dāng)前的js文件
得到這個就好辦了,通過curJS.src即可獲取到完整的路徑內(nèi)容(包括參數(shù))。
2、下面的就是解析參數(shù)內(nèi)容了,解析的過程相當(dāng)簡單,相信很多人都容易完成這一步。
但我們要對一個特殊情況進(jìn)行處理:如果一個參數(shù)被傳入了多次,則要將該參數(shù)值轉(zhuǎn)換為數(shù)組存儲每一個傳入的值。
完整測試腳本如下:
var getArgs=(function(){
var sc=document.getElementsByTagName('script');
var paramsArr=sc[sc.length-1].src.split('?')[1].split('&');
var args={},argsStr=[],param,t,name,value;
for(var i=0,len=paramsArr.length;i<len;i++){
param=paramsArr[i].split('=');
name=param[0],value=param[1];
if(typeof args[name]=="undefined"){ //參數(shù)尚不存在
args[name]=value;
}else if(typeof args[name]=="string"){ //參數(shù)已經(jīng)存在則保存為數(shù)組
args[name]=[args[name]]
args[name].push(value);
}else{ //已經(jīng)是數(shù)組的
args[name].push(value);
}
}
/*在實(shí)際應(yīng)用中下面的showArg和args.toString可以刪掉,這里只是為了測試函數(shù)getArgs返回的內(nèi)容*/
var showArg=function(x){ //轉(zhuǎn)換不同數(shù)據(jù)的顯示方式
if(typeof(x)=="string"&&!/\d+/.test(x)) return "'"+x+"'"; //字符串
if(x instanceof Array) return "["+x+"]" //數(shù)組
return x; //數(shù)字
}
//組裝成json格式
args.toString=function(){
for(var i in args) argsStr.push(i+':'+showArg(args[i]));
return '{'+argsStr.join(',')+'}';
}
return function(){return args;} //以json格式返回獲取的所有參數(shù)
})();
alert(getArgs());
alert("username:"+getArgs()["username"]);
測試示例的HTML源碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<meta name="author" content="" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript" src="test.js?id=4&username=yemoo&id=1&uid=110"></script>
<script type="text/javascript" src="test.js?id=5&username=ajaxbbs&id=7&uid=253"></script>
<script type="text/javascript" src="test.js?id=6&username=jack&id=8&uid=258"></script>
</head>
<body>
</body>
</html>
腳本之家演示代碼 http://demo.jb51.net/js/2011/jscc/
1、首先獲取到當(dāng)前JS文件的SRC屬性,這里有一個小技巧:我們只需要獲取當(dāng)前頁面最后一個script標(biāo)記內(nèi)容即可。
為什么??因?yàn)镴S是順序解析的,當(dāng)前JS腳本解析時后面的js都還沒有解析到,當(dāng)然就認(rèn)為自己就是最后一個script了。此外,這樣獲取還有一個好處:我們可以多次引用同一個文件且傳入不同的參數(shù),這樣可以在js文件中根據(jù)參數(shù)不同做不同處理,很巧妙把!簡直就是動態(tài)語言了。
代碼如下:
復(fù)制代碼 代碼如下:
var scripts=document.getElementsByTagName("script");
var curJS=scripts[scripts.length-1]; //curJS就是我們當(dāng)前的js文件
得到這個就好辦了,通過curJS.src即可獲取到完整的路徑內(nèi)容(包括參數(shù))。
2、下面的就是解析參數(shù)內(nèi)容了,解析的過程相當(dāng)簡單,相信很多人都容易完成這一步。
但我們要對一個特殊情況進(jìn)行處理:如果一個參數(shù)被傳入了多次,則要將該參數(shù)值轉(zhuǎn)換為數(shù)組存儲每一個傳入的值。
完整測試腳本如下:
復(fù)制代碼 代碼如下:
var getArgs=(function(){
var sc=document.getElementsByTagName('script');
var paramsArr=sc[sc.length-1].src.split('?')[1].split('&');
var args={},argsStr=[],param,t,name,value;
for(var i=0,len=paramsArr.length;i<len;i++){
param=paramsArr[i].split('=');
name=param[0],value=param[1];
if(typeof args[name]=="undefined"){ //參數(shù)尚不存在
args[name]=value;
}else if(typeof args[name]=="string"){ //參數(shù)已經(jīng)存在則保存為數(shù)組
args[name]=[args[name]]
args[name].push(value);
}else{ //已經(jīng)是數(shù)組的
args[name].push(value);
}
}
/*在實(shí)際應(yīng)用中下面的showArg和args.toString可以刪掉,這里只是為了測試函數(shù)getArgs返回的內(nèi)容*/
var showArg=function(x){ //轉(zhuǎn)換不同數(shù)據(jù)的顯示方式
if(typeof(x)=="string"&&!/\d+/.test(x)) return "'"+x+"'"; //字符串
if(x instanceof Array) return "["+x+"]" //數(shù)組
return x; //數(shù)字
}
//組裝成json格式
args.toString=function(){
for(var i in args) argsStr.push(i+':'+showArg(args[i]));
return '{'+argsStr.join(',')+'}';
}
return function(){return args;} //以json格式返回獲取的所有參數(shù)
})();
alert(getArgs());
alert("username:"+getArgs()["username"]);
測試示例的HTML源碼:
復(fù)制代碼 代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<meta name="generator" content="editplus" />
<meta name="author" content="" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript" src="test.js?id=4&username=yemoo&id=1&uid=110"></script>
<script type="text/javascript" src="test.js?id=5&username=ajaxbbs&id=7&uid=253"></script>
<script type="text/javascript" src="test.js?id=6&username=jack&id=8&uid=258"></script>
</head>
<body>
</body>
</html>
腳本之家演示代碼 http://demo.jb51.net/js/2011/jscc/
相關(guān)文章
JavaScript原始數(shù)據(jù)類型Symbol的用法詳解
Symbol是ES6中引入的一種新的基本數(shù)據(jù)類型,用于表示一個獨(dú)一無二的值。它是JavaScript中的第七種數(shù)據(jù)類型。本文將詳細(xì)講講Symbol的使用,需要的可以參考一下2022-11-11
淺析JavaScript定時器setTimeout的時延問題
這篇文章主要為大家詳細(xì)介紹了JavaScript中定時器setTimeout有最小時延的相關(guān)知識,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
javaScript同意等待代碼實(shí)現(xiàn)心得
javaScript功能描述:本程序?qū)崿F(xiàn)在同意某某協(xié)議頁面對同意按鈕進(jìn)行十秒鐘的禁用,同時在按鈕的Value顯示倒計(jì)時。2011-01-01
extjs圖表繪制之條形圖實(shí)現(xiàn)方法分析
這篇文章主要介紹了extjs圖表繪制之條形圖實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了extjs繪制條形圖的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-03-03
簡單幾行JS Code實(shí)現(xiàn)IE郵件轉(zhuǎn)發(fā)新浪微博
大概就是說我們可以用window.external.menuArguments這個對象獲取到內(nèi)部的信息,如window,document這些常用的對象2013-07-07
javacript replace 正則取字符串中的值并替換【推薦】
replace() 方法用于在字符串中用一些字符替換另一些字符,或替換一個與正則表達(dá)式匹配的子串。這篇文章主要介紹了javacript replace 正則取字符串中的值并替換,需要的朋友可以參考下2018-09-09
原生JavaScript實(shí)現(xiàn)合并多個數(shù)組示例
這篇文章主要介紹了原生的JavaScript及jquery實(shí)現(xiàn)合并多個數(shù)組,很簡單,很實(shí)用,大家可以看看2014-09-09
JS實(shí)現(xiàn)線性表的順序表示方法示例【經(jīng)典數(shù)據(jù)結(jié)構(gòu)】
這篇文章主要介紹了JS實(shí)現(xiàn)線性表的順序表示方法,簡單分析了線性表的原理并結(jié)合實(shí)例形式給出了線性表的插入與刪除實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04

