首頁 >web前端 >js教程 >給js檔案傳參數(詳解)_javascript技巧

給js檔案傳參數(詳解)_javascript技巧

WBOY
WBOY原創
2016-05-16 16:42:071585瀏覽

一、利用全域變數

這是最簡單的一種方式,像是Google Adsense:

複製程式碼 程式碼如下:


缺點是引入了全域變數。其中引入文件的方式還有兩個變體:

// 变体1:用document.write输出
 <script type="text/javascript"> google_ga_id ='g6u7un8646xx'; 
document.write(unescape('%3Cscript type="text/javascript" src= "http://www.google-analytics.com/ga.js"%3E%3C/script%3E')); </script> 
// 变体2:用DOM操作append到head里 
<script type="text/javascript"> 
G_BEACON_ATP ='category=&userid=&channel=112ad_id=';
 document.getElementsByTagName('head')[0].appendChild(document. createElement('script')).src='http://taobao.com/atp.js'; 
</script> // 注意:上面的代码是根据实际应用虚拟的示范代码

註:變體1應用很多,常見寫法如下:

<script type="text/javascript"> 
// 直接转义即可: 
document.write('<script type="text/javascript" src="test.js"></script>'); 
// 或者像Yahoo!首页一样: 
document.write('<scr'+'ipt type="text/javascript" src="test.js"></scr'+'ipt>');
</script>

二、取得並解析script元素的src

和全部變數相比,我們更希望能像下面這樣傳入參數:

核心問題是如何取得到src屬性。

方法一是為script新增id屬性,透過id得到目前script,再用正規從src中取出參數。缺點是HTML 4.01 Specification裡,SCRIPT元素沒有id屬性。這個缺點也算不得是缺點,畢竟盡信標準不如無標準。

方法二是用js的檔名當作鉤子,js程式碼裡經過document.getElementsByTagName('script')後,正則比對目前js檔。這個方法很正統,但要求檔案名稱唯一。缺點是程式碼多,不精煉,對效能也稍有影響。

方法三是在方法一的基礎上,乾脆再增加一個自訂屬性data:

test.js檔案裡,透過下面這行得到傳入的參數:

var scriptArgs = document.getElementById('testScript').getAttribute('data');方法四是利用js的順序執行機制(js檔案的載入可以是同步或非同步方式,但執行時,一定是按照在文檔流中的順序來執行的)。當某個js檔案執行時,一定是「已載入」的js檔案中的最後一個:

var scripts = document.getElementsByTagName('script'); var currentScript = scripts[scripts.length - 1];方法四比方法二更靈巧天才。

從程式碼的精簡和效能上講,方法三 > 方法 一 > 方法四 > 方法二

小結:如果你很在意標準,推薦方法四;如果跟我一樣覺得沒必要完全遵守標準,推薦方法三。

寫了一個測驗程式

<!DOCTYPE html>
<html>
<script src="a2.js">
</script>
<script src="a2.js">
</script>
<script src="a2.js">
</script>
</html>

a2.js

var scripts = document.getElementsByTagName('script'); var currentScript = scripts.length;alert(currentScript);

分別印出 

1 2 3

三、靈感方案

如果你跟我一樣是John Resig的忠實fans,或許還記得去年8月份討論得很火爆的《Degrading Script Tags》。 John Resig為我們開啟了一扇想像的門,對於本文的問題來說,還可以用以下「邪門歪道」來實現:

在test.js檔案裡:

TB = {}; TB.SomeApp = {}; 
var scripts = document.getElementsByTagName("script");
eval(scripts[ scripts.length - 1 ].innerHTML);

這樣就將參數儲存到了TB.SomeApp.scriptArgs變數裡。

當參數不多時,甚至可以這樣:

js檔案裡:

var scripts = document.getElementsByTagName("script"); 
var scriptArgs = scripts[ scripts.length - 1 ].innerHTML.replace(/[s]/g, '');

想像是無止境的,還可以利用onload:

js檔案裡定義好函數即可:

TB = {}; 
TB.SomeFun = function(arg) { 
//code
};

上面的程式碼在非ie瀏覽器下,都能正確運作。針對笨笨的ie,還要加幾行程式碼:

if(window.ActiveXObject) { 
var scripts = document.getElementsByTagName('script'); 
eval(scripts[scripts.length - 1].getAttribute('onload'));
}
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn