日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

多种思路给js文件传递参数

發(fā)布時(shí)間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多种思路给js文件传递参数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

來(lái)源:http://www.himm.cn/blog/post/11.html

?

一、利用全局變量

這是最簡(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)寫(xiě)法如下:

<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),推薦方法三。

三、靈感方案

如果你和我一樣是John Resig的忠實(shí)fans,或許還記得去年8月份討論得很火爆的《Degrading Script Tags》。John Resig給我們開(kāi)啟了一扇想象的門(mén),對(duì)于本文的問(wèn)題來(lái)說(shuō),還可以用以下“邪門(mén)歪道”來(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" οnlοad="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'));
}
只要繼續(xù)發(fā)揚(yáng)挖掘精神,我相信還有更多靈感方案-.-

總結(jié)

以上是生活随笔為你收集整理的多种思路给js文件传递参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。