逸品天空Web開發程式碼站ASP及其他Web開發相關經典程式碼收集部落格- ASP交流QQ群12814238(滿) 14725152(開放)首頁ASPJS/AJAX重構優化綜合程式資料庫收集分享影音娛樂作業系統上一篇| 下一篇JS/AJAX
JavaScript 如何給JavaScript檔案傳遞參數作者:逸品日期:2009-03-23
字體大小: 小中
大一
、利用全域變數這是最簡單的一種方式,例如Google Adsense:
程式碼
<script type="text/javascript">
google_ad_client = 'pub-3741595817388494';
</script>
<script type="text/javascript" src=" http://pagead2 .
googlesyndication.com/pagead/show_ads.js"></script>
缺點是引入了全局變數。其中引入文件的方式還有兩個變體:
程式碼
// 變體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
和全部變數相比,我們更希望能像下面這樣傳入參數:
程式碼
<script type="text/javascript" src="test.js?a=b&c=d"></script>
核心問題是如何取得到src屬性。
方法一是為script新增id屬性,透過id得到目前script,再用正規從src中取出參數。缺點是HTML 4.01 Specification裡,SCRIPT元素沒有id屬性。這個缺點也算不得是缺點,畢竟盡信標準不如無標準。
方法二是用js的檔名當作鉤子,js程式碼裡經過document.getElementsByTagName('script')後,正則配對出目前js檔。這個方法很正統,但要求檔案名稱唯一。缺點是程式碼多,不精煉,對效能也稍有影響。
方法三是在方法一的基礎上,乾脆再增加一個自訂屬性data:
程式碼
<script id="testScript" type="text/javascript" src="test.js" data="a=b&c=d"></script>
test.js檔案裡,透過下面這行得到傳入的參數:
程式碼
var scriptArgs = document.getElementById('testScript').getAttribute('data');
方法四是利用js的順序執行機制(js檔案的載入可以是同步或非同步方式,但執行時,一定是按照在文檔流程中的順序來執行的)。當某個js檔案執行時,一定是「已載入」的js檔案中的最後一個:
程式碼
var scripts = document.getElementsByTagName('script');
var currentScript = scripts[scripts.length - 1];
方法四比方法二更靈巧天才。
從程式碼的精簡和效能上講,方法三> 方法一> 方法四> 方法二
小結:如果你很在意標準,推薦方法四;如果跟我一樣覺得沒必要完全遵守標準,推薦方法三。
三、靈感方案如果你跟我一樣是John Resig的忠實fans,或許還記得去年8月份討論得很火爆的《Degrading Script Tags》。 John Resig為我們開啟了一扇想像的門,對於本文的問題來說,還可以用以下「邪門歪道」來實現:
程式碼
<script type="text/javascript" src="test.js">
TB.SomeApp.scriptArgs = 'a=b&c=d';
</script>
在test.js檔案裡:
程式碼
TB = {}; TB.SomeApp = {};
var scripts = document.getElementsByTagName("script");
eval(scripts[ scripts.length - 1 ].innerHTML);
這樣就將參數儲存到了TB.SomeApp.scriptArgs變數裡。
當參數不多時,甚至可以這樣:
程式碼
<script type="text/javascript" src="test.js">a=b&c=d</script>
js檔案裡:
程式碼
var scripts = document.getElementsByTagName("script");
var scriptArgs = scripts[ scripts.length - 1 ].innerHTML.replace(/[s]/g, '');
想像是無止境的,還可以利用onload:
程式碼
<script type="text/javascript" src="test.js" xxxxx="TB.SomeFun('a=b&c=d')"></script>
js檔案裡定義好函數即可:
程式碼
TB = {};
TB.SomeFun = function(arg) { //code };
上面的程式碼在非ie瀏覽器下,都能正確運作。針對笨笨的ie,還要加幾行程式碼:
程式碼
if(window.ActiveXObject) {
var scripts = document.getElementsByTagName('script');
eval(scripts[scripts.length - 1].getAttribute('onload'));
}
只要繼續發揚挖掘精神,我相信還有更多靈感方案-.-
總結看了上面這麼多解決方案,究竟哪個方案最好呢?我的答案是:沒有最好,只有最適合!因為對於不同的應用,以及不同的理念來說,對「好」的定義是各異的。
例如我目前的理念,覺得沒必要完全遵守標準,而全域變量,要避免的是濫用,不是不用。因此我會選擇全域變數方案,最簡單,效能也最好。