新聞中心
一、利用全局變量進(jìn)行船體參數(shù)
這是最簡(jiǎn)單的一種方式,比如Google Adsense:

成都創(chuàng)新互聯(lián)公司成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元杞縣做網(wǎng)站,已為上家服務(wù),為杞縣各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
程序代碼
缺點(diǎn)是引入了全局變量。其中引入文件的方式還有兩個(gè)變體:
程序代碼
// 變體1:用document.write輸出
程序代碼
// 變體2:用DOM操作append到head里
注意:上面的代碼是根據(jù)實(shí)際應(yīng)用虛擬的示范代碼
注:變體1應(yīng)用很多,常見寫法如下:
程序代碼
二、獲取并解析script元素的src進(jìn)行傳遞參數(shù)
和全部變量相比,我們更希望能像下面這樣傳入?yún)?shù):
程序代碼
核心問題是如何獲取到src屬性。
方法一是給script添加id屬性,通過id得到當(dāng)前script,再用正則從src中取出參數(shù)。缺點(diǎn)是HTML 4.01 Specification里,SCRIPT元素沒有id屬性。這個(gè)缺點(diǎn)也算不得是缺點(diǎn),畢竟盡信標(biāo)準(zhǔn)不如無標(biāo)準(zhǔn)。
方法二是用js的文件名當(dāng)作鉤子,js代碼里通過document.getElementsByTagName('script')后,正則匹配出當(dāng)前js文件。這個(gè)方法很正統(tǒng),但要求文件名唯一。缺點(diǎn)是代碼多,不精煉,對(duì)性能也稍有影響。
方法三是在方法一的基礎(chǔ)上,干脆再添加一個(gè)自定義屬性data:
程序代碼
test.js文件里,通過下面這行得到傳入的參數(shù):
程序代碼
var scriptArgs = document.getElementById('testScript').getAttribute('data');
方法四是利用js的順序執(zhí)行機(jī)制(js文件的加載可以是同步或異步方式,但執(zhí)行時(shí),一定是按照在文檔流中的順序來執(zhí)行的)。當(dāng)某個(gè)js文件執(zhí)行時(shí),一定是“已加載”的js文件中的***一個(gè):
程序代碼
var scripts = document.getElementsByTagName('script');
var currentScript = scripts[scripts.length - 1];
方法四比方法二更靈巧天才。
從代碼的精簡(jiǎn)和性能上講,方法三 > 方法 一 > 方法四 > 方法二
小結(jié):如果你很在意標(biāo)準(zhǔn),推薦方法四;如果和我一樣覺得沒必要完全遵守標(biāo)準(zhǔn),推薦方法三。
三、靈感方案
如果你和我一樣是John Resig的忠實(shí)fans,或許還記得去年8月份討論得很火爆的《Degrading Script Tags》。John Resig給我們開啟了一扇想象的門,對(duì)于本文的問題來說,還可以用以下“邪門歪道”來實(shí)現(xiàn):
程序代碼
在test.js文件里:
程序代碼
TB = {}; TB.SomeApp = {};
var scripts = document.getElementsByTagName("script");
eval(scripts[ scripts.length - 1 ].innerHTML);
這樣就將參數(shù)存儲(chǔ)到了TB.SomeApp.scriptArgs變量里。
當(dāng)參數(shù)不多時(shí),甚至可以這樣:
程序代碼
js文件里:
程序代碼
var scripts = document.getElementsByTagName("script");
var scriptArgs = scripts[ scripts.length - 1 ].innerHTML.replace(/[\s]/g, '');
想象是無止境的,還可以利用onload:
程序代碼
js文件里定義好函數(shù)即可:
程序代碼
TB = {};
TB.SomeFun = function(arg) { //code };
上面的代碼在非ie瀏覽器下,都能正確運(yùn)行。針對(duì)笨笨的ie,還得加幾行代碼:
程序代碼
if(window.ActiveXObject) {
var scripts = document.getElementsByTagName('script');
eval(scripts[scripts.length - 1].getAttribute('onload'));
}
只要繼續(xù)發(fā)揚(yáng)挖掘精神,我相信還有更多靈感方案-.-
總結(jié)
看了上面這么多解決方案,究竟哪個(gè)方案***呢?我的答案是:沒有***,只有最合適!因?yàn)閷?duì)于不同的應(yīng)用,以及不同的理念來說,對(duì)“好”的定義是各異的。
比如我當(dāng)前的理念,覺得沒必要完全遵守標(biāo)準(zhǔn),而全局變量,要避免的是濫用,不是不用。因此我會(huì)選擇全局變量方案,最簡(jiǎn)單,性能也***。
新聞名稱:JavaScript如何給JavaScript文件傳遞參數(shù)
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/djgedoo.html


咨詢
建站咨詢
