給js文件傳參數(shù)(詳解)
一、利用全局變量
這是最簡(jiǎn)單的一種方式,比如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>
缺點(diǎn)是引入了全局變量。其中引入文件的方式還有兩個(gè)變體:
// 變體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> // 注意:上面的代碼是根據(jù)實(shí)際應(yīng)用虛擬的示范代碼
注:變體1應(yīng)用很多,常見(jiàn)寫法如下:
<script type="text/javascript">
// 直接轉(zhuǎn)義即可:
document.write('<script type="text/javascript" src="test.js"></script>');
// 或者像Yahoo!首頁(yè)一樣:
document.write('<scr'+'ipt type="text/javascript" src="test.js"></scr'+'ipt>');
</script>
二、獲取并解析script元素的src
和全部變量相比,我們更希望能像下面這樣傳入?yún)?shù):
<script type="text/javascript" src="test.js?a=b&c=d"></script>
核心問(wèn)題是如何獲取到src屬性。
方法一是給script添加id屬性,通過(guò)id得到當(dāng)前script,再用正則從src中取出參數(shù)。缺點(diǎn)是HTML 4.01 Specification里,SCRIPT元素沒(méi)有id屬性。這個(gè)缺點(diǎn)也算不得是缺點(diǎn),畢竟盡信標(biāo)準(zhǔn)不如無(wú)標(biāo)準(zhǔn)。
方法二是用js的文件名當(dāng)作鉤子,js代碼里通過(guò)document.getElementsByTagName('script')后,正則匹配出當(dāng)前js文件。這個(gè)方法很正統(tǒng),但要求文件名唯一。缺點(diǎn)是代碼多,不精煉,對(duì)性能也稍有影響。
方法三是在方法一的基礎(chǔ)上,干脆再添加一個(gè)自定義屬性data:
<script id="testScript" type="text/javascript" src="test.js" data="a=b&c=d"></script>
test.js文件里,通過(guò)下面這行得到傳入的參數(shù):
var scriptArgs = document.getElementById('testScript').getAttribute('data');方法四是利用js的順序執(zhí)行機(jī)制(js文件的加載可以是同步或異步方式,但執(zhí)行時(shí),一定是按照在文檔流中的順序來(lái)執(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),推薦方法四;如果和我一樣覺(jué)得沒(méi)必要完全遵守標(biāo)準(zhǔn),推薦方法三。
寫了個(gè)測(cè)試程序
<!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的忠實(shí)fans,或許還記得去年8月份討論得很火爆的《Degrading Script Tags》。John Resig給我們開(kāi)啟了一扇想象的門,對(duì)于本文的問(wèn)題來(lái)說(shuō),還可以用以下“邪門歪道”來(lái)實(shí)現(xiàn):
<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);
這樣就將參數(shù)存儲(chǔ)到了TB.SomeApp.scriptArgs變量里。
當(dāng)參數(shù)不多時(shí),甚至可以這樣:
<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, '');
想象是無(wú)止境的,還可以利用onload:
<script type="text/javascript" src="test.js" onload="TB.SomeFun('a=b&c=d')"></script>
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'));
}
相關(guān)文章
javaScript 計(jì)算兩個(gè)日期的天數(shù)相差(示例代碼)
本篇文章主要介紹了javaScript 計(jì)算兩個(gè)日期的天數(shù)相差(示例代碼) 需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
JavaScript基于libgif.js實(shí)現(xiàn)控制gif動(dòng)畫幀
這篇文章主要為大家詳細(xì)介紹了JavaScript如何利用libgif.js插件控制gif動(dòng)畫幀,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
JavaScript中具名函數(shù)的多種調(diào)用方式總結(jié)
這篇文章主要介紹了JavaScript中具名函數(shù)的多種調(diào)用方式總結(jié),本文總結(jié)了4種方法,需要的朋友可以參考下2014-11-11
Javascript實(shí)現(xiàn)拖拽排序的代碼
這篇文章主要介紹了Javascript實(shí)現(xiàn)拖拽排序的代碼,本文在vue運(yùn)行環(huán)境下給大家演示下效果圖,對(duì)js拖拽排序?qū)嵗a感興趣的朋友跟隨小編一起看看吧2022-09-09
使用JS實(shí)現(xiàn)鼠標(biāo)放上圖片進(jìn)行放大離開(kāi)實(shí)現(xiàn)縮小功能
這篇文章主要介紹了使用JS實(shí)現(xiàn)鼠標(biāo)放上圖片進(jìn)行放大離開(kāi)實(shí)現(xiàn)縮小功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
原生javascript實(shí)現(xiàn)的一個(gè)簡(jiǎn)單動(dòng)畫效果
下面小編就為大家?guī)?lái)一篇原生javascript實(shí)現(xiàn)的一個(gè)簡(jiǎn)單動(dòng)畫效果。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-03-03
深入理解JavaScript系列(34):設(shè)計(jì)模式之命令模式詳解
這篇文章主要介紹了深入理解JavaScript系列(34):設(shè)計(jì)模式之命令模式詳解,命令模式(Command)的定義是:用于將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及執(zhí)行可撤銷的操作,需要的朋友可以參考下2015-03-03
js控制網(wǎng)頁(yè)背景音樂(lè)播放與停止的方法
這篇文章主要介紹了js控制網(wǎng)頁(yè)背景音樂(lè)播放與停止的方法,實(shí)例分析了javascript控制背景音樂(lè)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
深入解析微信小程序開(kāi)發(fā)中遇到的幾個(gè)小問(wèn)題
這篇文章主要介紹了微信小程序開(kāi)發(fā)中遇到的幾個(gè)小問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

