最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript動(dòng)態(tài)加載實(shí)現(xiàn)方法一

 更新時(shí)間:2012年08月22日 21:27:52   作者:  
這兩天,沒(méi)什么太多的事情,好吧,我承認(rèn),是我這兩天不想做公司的項(xiàng)目,因?yàn)槲彝话l(fā)奇想,其實(shí)也不算突發(fā)奇想,算是對(duì)以前的想法的實(shí)現(xiàn),就是把JS當(dāng)做Java來(lái)寫(xiě)
現(xiàn)在也有很多JS動(dòng)態(tài)加載的框架,比如In.js。但是這種并不是我想要的編寫(xiě)方式,我來(lái)說(shuō)說(shuō)我的想法。

先來(lái)一段java代碼
復(fù)制代碼 代碼如下:

import Biz.User;
User u = new User();
u.show();

按流程就是導(dǎo)包、實(shí)例化、調(diào)用。

JS是做不了導(dǎo)包的,或者說(shuō)代碼意義上的導(dǎo)包,一般只是在頁(yè)面上進(jìn)行script標(biāo)簽的引入。
那么 先假設(shè)需要寫(xiě)成這樣
復(fù)制代碼 代碼如下:

Using("User");
var u = new User();
u.show();

那么,在JS里面可以實(shí)現(xiàn)嗎?

來(lái)一句一句的分析,當(dāng)然,前提是頁(yè)面并不用script標(biāo)簽載入user.js,不然就沒(méi)意義了。

第一句

Using("User");

為什么用Using,當(dāng)然只是我的一個(gè)命名想法而已,可以聯(lián)想一下C#,用的就是using,借來(lái)而已。

Using里面寫(xiě)入的當(dāng)然是我需要的對(duì)象User,顧名思義,我當(dāng)然寫(xiě)成Using("User")了。先不說(shuō)內(nèi)里是怎么實(shí)現(xiàn)的,起碼思路是這樣。
因?yàn)椴荒苣M關(guān)鍵字寫(xiě)成 Using User;這種起碼我是做不到了。
第二句和第三句
復(fù)制代碼 代碼如下:

var u = new User();
u.show();

很正常,就是很平常的實(shí)例化與函數(shù)調(diào)用,唯一不解的是User對(duì)象哪里來(lái)的?那么當(dāng)然是第一句導(dǎo)包的時(shí)候?qū)氲摹?


流程就是這么個(gè)流程,那么到底能不能實(shí)現(xiàn),關(guān)鍵就在第一句話。也就是說(shuō),到底能不能導(dǎo)包成功,而且該怎么導(dǎo)包。

從script標(biāo)簽吸引靈感,對(duì),異步加載所需要的js文件。
也就是說(shuō)
復(fù)制代碼 代碼如下:

Using("User");

相當(dāng)于寫(xiě)了一句
復(fù)制代碼 代碼如下:
<script type="text/javascript" src="user.js"></script>


現(xiàn)在這么看下來(lái),這么做有意義嗎?就為把script標(biāo)簽寫(xiě)成JS動(dòng)態(tài)引入的?或者,只為少寫(xiě)幾個(gè)字符?

當(dāng)然不能,這么做毫無(wú)意義!那要怎么做?
先從效率來(lái)講。
如果一個(gè)頁(yè)面需要載入N多js文件的時(shí)候,如下
復(fù)制代碼 代碼如下:

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="view.js"></script>
<script type="text/javascript" src="register.js"></script>
<script type="text/javascript" src="validate.js"></script>
<script type="text/javascript" src="user.js"></script>
<script type="text/javascript" src="order.js"></script>
<script type="text/javascript" src="type.js"></script>

等等等等。

是不是很?chē)樔?,那是相?dāng)嚇人,而且后期維護(hù)需要很高的成本,有多少頁(yè)面,可能就需要修改幾個(gè)頁(yè)面。那么,當(dāng)頁(yè)面只引入關(guān)鍵的幾個(gè)js文件,其他文件都采用動(dòng)態(tài)載入的方式呢?
比如我們只需要載入jquery文件,然后調(diào)用
復(fù)制代碼 代碼如下:

$.getScript("user.js",function(){});

這樣,我們就做到頁(yè)面文件里面只需要引入
復(fù)制代碼 代碼如下:

<script type="text/javascript" src="jquery.min.js"></script>

即可。
那么這種寫(xiě)法的壞處在哪里?看一段代碼
復(fù)制代碼 代碼如下:

$.getScript("user.js",function(){
$.getScript("order.js",function(){
$.getScript("type.js",function(){
$.getScript("validate.js",function(){
// and so on..
});
});
});
});

PS:用In.js的watch函數(shù)是可以避免這種情況產(chǎn)生的。這不在本博文的考慮范圍了。

花眼嗎?還愿意去對(duì)齊代碼嗎?即便有格式化工具,你還愿意將閉合括號(hào)與哪個(gè)$.getScript對(duì)應(yīng)嗎?當(dāng)然不愿意。
那么,仿java的導(dǎo)包形式應(yīng)聲而出。
復(fù)制代碼 代碼如下:

Using("User");
Using("Order");
Using("Type");
Using("Validate");
// and so on..

或者你愿意,你可以
復(fù)制代碼 代碼如下:

Using("User","Type","Order","Validate",...);

寫(xiě)法問(wèn)題 無(wú)所謂。當(dāng)然我推薦使用第一種方法,清晰。

導(dǎo)包之后,所有的用法不需要任何嵌套,正常使用。
復(fù)制代碼 代碼如下:

var u = new User();
var o = new Order();
// and so on..

但是會(huì)提出一個(gè)問(wèn)題。假如異步的加載都在Using("XXX")的時(shí)候執(zhí)行,那么
復(fù)制代碼 代碼如下:

Using("User");
Using("Order");
Using("Type");
Using("Validate");
// and so on..

這一段我就需要異步載入4個(gè)文件,雖然是異步的,但是未免有些麻煩?而且需要?jiǎng)?chuàng)建4個(gè)鏈接。你愿意合并JS的話,也可以。而且,Using的時(shí)候我是不需要使用對(duì)象的,這個(gè)時(shí)候未免太浪費(fèi)資源了?

至于這個(gè)問(wèn)題,我的解決辦法就是學(xué)習(xí)hibernate,延遲加載,按需加載。
那么怎么做呢?
復(fù)制代碼 代碼如下:

Using("User");

這個(gè)時(shí)候肯定是不加載,不加載做什么?當(dāng)然是返回一個(gè)mock,也就是模擬對(duì)象。給用戶(hù)先用著,只有當(dāng)用戶(hù)真正需要使用這個(gè)對(duì)象的時(shí)候,再去加載所需的js。也就是說(shuō)
復(fù)制代碼 代碼如下:

Using("User"); // 這句話執(zhí)行完畢之后會(huì)創(chuàng)建一個(gè)User對(duì)象,當(dāng)時(shí)僅僅是個(gè)mock
var u = new User(); // 這個(gè)時(shí)候用需要的是真實(shí)的User對(duì)象實(shí)例,就在這個(gè)時(shí)候去動(dòng)態(tài)加載JS文件,并且返回已經(jīng)實(shí)例化的User對(duì)象

大家都知道,異步加載是與當(dāng)前運(yùn)行的狀態(tài)不沖突的,也就是說(shuō)
復(fù)制代碼 代碼如下:

var u = new User();

這句話執(zhí)行之后,u是一個(gè)沒(méi)有實(shí)際意義值的變量,而已。那么,怎么解決這個(gè)問(wèn)題,我暫且想到的辦法,只能是采用同步策略了。只有當(dāng)js加載完畢,再去執(zhí)行之后的js語(yǔ)句,這個(gè)地方有點(diǎn)遺憾,而且同步可能帶來(lái)的瀏覽器假死,也是一個(gè)比較嚴(yán)重的問(wèn)題,暫且不顧這些問(wèn)題,希望以后能有更好的辦法解決。

那問(wèn)題出來(lái)了,這么做同步,有什么優(yōu)勢(shì)嗎?
我不知道有什么優(yōu)勢(shì),起碼對(duì)比異步加載,應(yīng)該沒(méi)有劣勢(shì)。比如正常的異步加載為
復(fù)制代碼 代碼如下:

$.getScript("user.js",function(){
var u = new User();
});

單單執(zhí)行這個(gè)語(yǔ)句,要執(zhí)行到function,本質(zhì)上也是等user.js加載完畢才會(huì)執(zhí)行,那么對(duì)比
復(fù)制代碼 代碼如下:

var u = new User();

理論上時(shí)間應(yīng)該相當(dāng),因?yàn)槎际堑萿ser.js加載完畢之后才執(zhí)行的。

起碼第二種看起來(lái)更像java式的代碼,不必理會(huì)其他非業(yè)務(wù)相關(guān)的代碼。

那么,怎么會(huì)知道需要的對(duì)象在什么地方,怎么加載進(jìn)來(lái)?我能想到的就是模擬一個(gè)配置文件,為什么用配置文件,而不是像In.js用add函數(shù)或者其他框架的類(lèi)似于register的函數(shù),大概我只是想用配置文件,更像java,而且后期的修改起來(lái)也會(huì)更解耦一些吧。
復(fù)制代碼 代碼如下:

Using.Config = {
"User" : "/js/user" // 可以隱去.js 因?yàn)榭隙ㄊ羌虞dJS文件了
}

整個(gè)思路大概就是這個(gè)樣子,我在其基礎(chǔ)上進(jìn)行了一些約束,比如加入了命名空間
復(fù)制代碼 代碼如下:

var u = new Using.Modules.User();

這樣可以減少一些全局變量,而且有需要的話,可以插入一些所有對(duì)象可能都具有的共性,減少創(chuàng)建類(lèi)時(shí)的重復(fù)編碼。

當(dāng)然,也還是支持不使用命名空間的。

為了解決這個(gè)約束的效力,加入了Class.create函數(shù)來(lái)進(jìn)行類(lèi)創(chuàng)建約束。
復(fù)制代碼 代碼如下:

Using.Class.create("User",function(){
}).property({
}).static({
}).namespace(Using.Modules);

這里的大概意思就是

create(類(lèi)名,構(gòu)造函數(shù))
property(類(lèi)的屬性)
static(類(lèi)的靜態(tài)屬性)
namespace(命名空間)

引申到此,為何不加入MVC形式?
后來(lái)我發(fā)現(xiàn),要MVC,那么幾個(gè)類(lèi)之間的動(dòng)態(tài)維護(hù),或者創(chuàng)建之時(shí)就由Using這個(gè)類(lèi)來(lái)自動(dòng)維護(hù),暫時(shí)還沒(méi)想到好的解決辦法,所以沒(méi)有加入其中,只能自己創(chuàng)建類(lèi),自己維護(hù)了.

通過(guò)上面的文字,最后得到一個(gè)Using.js
然后在頁(yè)面里面就只需要引入一個(gè)
復(fù)制代碼 代碼如下:

<script type="text/javascript" src="using.js"></script>

這樣接下來(lái)就可以寫(xiě)
復(fù)制代碼 代碼如下:

Using("jquery");
Using("User");

$("#ID").click(function(){
var user = new User();
user.name = "xx";
user.show();
});

相關(guān)文章

  • WebGL學(xué)習(xí)教程之Three.js學(xué)習(xí)筆記(第一篇)

    WebGL學(xué)習(xí)教程之Three.js學(xué)習(xí)筆記(第一篇)

    Three.js是一個(gè)js的開(kāi)源框架,它把webgl的所有東西都封裝好了,我們不再需要去了解webgl那些比較麻煩的細(xì)節(jié),直接在此框架上進(jìn)行開(kāi)發(fā),既方便,又快捷,而且很容易就能學(xué)習(xí),感興趣的朋友跟隨小編一起看看吧
    2019-04-04
  • JS實(shí)現(xiàn)選項(xiàng)卡實(shí)例詳解

    JS實(shí)現(xiàn)選項(xiàng)卡實(shí)例詳解

    這篇文章主要介紹了JS實(shí)現(xiàn)選項(xiàng)卡的方法,結(jié)合實(shí)例形式詳細(xì)講述了JavaScript實(shí)現(xiàn)選項(xiàng)卡的布局與功能實(shí)現(xiàn)的完整步驟及相關(guān)技巧,需要的朋友可以參考下
    2015-11-11
  • 解決layui中的form表單與button的點(diǎn)擊事件沖突問(wèn)題

    解決layui中的form表單與button的點(diǎn)擊事件沖突問(wèn)題

    今天小編就為大家分享一篇解決layui中的form表單與button的點(diǎn)擊事件沖突問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • event.currentTarget與event.target的區(qū)別介紹

    event.currentTarget與event.target的區(qū)別介紹

    event.currentTarget與event.target的區(qū)別想大家在使用的時(shí)候不是很在意,本文以測(cè)試代碼來(lái)講解它門(mén)之間的不同
    2012-12-12
  • js+div實(shí)現(xiàn)文字滾動(dòng)和圖片切換效果代碼

    js+div實(shí)現(xiàn)文字滾動(dòng)和圖片切換效果代碼

    這篇文章主要介紹了js+div實(shí)現(xiàn)文字滾動(dòng)和圖片切換效果代碼,涉及javascript鼠標(biāo)事件及頁(yè)面元素圖片滾動(dòng)效果實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • JS實(shí)現(xiàn)網(wǎng)頁(yè)標(biāo)題隨機(jī)顯示名人名言的方法

    JS實(shí)現(xiàn)網(wǎng)頁(yè)標(biāo)題隨機(jī)顯示名人名言的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)頁(yè)標(biāo)題隨機(jī)顯示名人名言的方法,涉及JavaScript中字符串、數(shù)組及隨機(jī)數(shù)的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • 改變layer confirm彈窗按鈕的顏色方法

    改變layer confirm彈窗按鈕的顏色方法

    今天小編就為大家分享一篇改變layer confirm彈窗按鈕的顏色方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • JavaScript變量和變換詳情

    JavaScript變量和變換詳情

    這篇文章主要介紹了JavaScript變量和變換詳情,文章基于JavaScript的相關(guān)資料展開(kāi)相關(guān)內(nèi)容需要的小伙伴可以慘一下
    2022-04-04
  • 詳解ES6數(shù)組方法find()、findIndex()的總結(jié)

    詳解ES6數(shù)組方法find()、findIndex()的總結(jié)

    這篇文章主要介紹了詳解ES6數(shù)組方法find()、findIndex()的總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • js的form表單提交url傳參數(shù)(包含+等特殊字符)的兩種解決方法

    js的form表單提交url傳參數(shù)(包含+等特殊字符)的兩種解決方法

    下面小編就為大家?guī)?lái)一篇js的form表單提交url傳參數(shù)(包含+等特殊字符)的兩種解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05

最新評(píng)論

当阳市| 南川市| 河曲县| 广河县| 长葛市| 于田县| 瑞昌市| 绥中县| 朔州市| 苏州市| 乃东县| 雷波县| 开阳县| 麻栗坡县| 渝北区| 衡水市| 平山县| 青阳县| 新干县| 绍兴县| 文登市| 广水市| 宁乡县| 高淳县| 育儿| 乐都县| 太康县| 喀喇沁旗| 昌江| 来宾市| 桓仁| 扶绥县| 松原市| 红河县| 黑龙江省| 乌恰县| 拜城县| 枝江市| 侯马市| 潢川县| 和硕县|