給js文件傳參數[轉]

1、利用全局變量

這是最簡單的一種方式,好比Google Adsense:javascript

<script type="text/javascript"> google_ad_client ='pub-3741595817388494'; </script>
<script type="text/javascript" src="http://pagead2. googlesyndication.com/pagead/show_ads.js"></script>


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

複製代碼

// 變體1:用document.write輸出
 
// 變體2:用DOM操做append到head裏 
 // 注意:上面的代碼是根據實際應用虛擬的示範代碼

複製代碼



注:變體1應用不少,常見寫法以下:java

<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>


2、獲取並解析script元素的src

和所有變量相比,咱們更但願能像下面這樣傳入參數:瀏覽器

<script type="text/javascript" src="test.js?a=b&c=d"></script>


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

方法一是給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文件中的最後一個:google

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

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

分別打印出  

1 2 3

3、靈感方案

若是你和我同樣是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 = {}; 
 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文件裏:

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

想象是無止境的,還能夠利用onload:

<script type="text/javascript" src="test.js" onload="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'));
}
相關文章
相關標籤/搜索