明天我就要開始改改jq的源碼了…
為了配合項目在辆,我設(shè)想了一個方式证薇,修改readylist的執(zhí)行順序度苔,以便資源加載完成之后開始初始化頁面…
先留個坑,明天實現(xiàn)以后寫后續(xù)…
2017.2.22 22:41
待續(xù)棕叫。林螃。。
-------------------------------------------------
2017-10-21 13:43:01
我去俺泣。一個待續(xù)就等到了這個時候了疗认,要不是來看看,我都快忘了還有這么個東西
這還是在天津的時候搞的東西伏钠,現(xiàn)在我在杭州横漏,新公司已經(jīng)待了快半年了,看看之前的代碼熟掂,來把這篇補上好了缎浇。。赴肚。
--------------------------------------------------
正文開始
我印象里邊這個修改是因為我們原來的項目里頭有一個include插件素跺,也是作為一個jQuery的插件存在的
然后這個插件是同步的,用xhr誉券,這導(dǎo)致了很大的性能問題
所以我希望能改成異步的
但是異步的加載指厌,響應(yīng)domready事件的時間點又不對了
這樣會導(dǎo)致如果頁面的js提前加載完畢,但是依賴的插件并沒有加載回來踊跟,這樣就會報錯
所以我希望在jQuery執(zhí)行domready回調(diào)的時候踩验,等待我的異步加載完成,加載完成了再開始回調(diào)商玫,這樣就不會有問題
現(xiàn)在就有兩個問題
1.?我需要監(jiān)測異步加載的完成(當(dāng)然我們的插件僅依賴于jQuery箕憾,所以不需要做依賴管理)
2.?我需要修改jQuery的源碼,以等待異步加載完成
具體的include源碼在我的github上拳昌,本來是在天津的時候說把我自己寫的一些插件都放上去袭异,但是后來工作的關(guān)系,沒時間炬藤,公司也不讓上傳代碼御铃,我自己電腦基本就懶得弄那些東西了法希。嵌赠。瞧哟。
其實說出來之后解決就比較簡單了,代碼簡單到隨便瞄一眼就能看懂细睡,不解釋了,上代碼
找到這個domReady處理函數(shù)帝火,看一眼溜徙,里面起作用的就是被我包起來的那句話
readyList.resoveWith( document, [ jQuery ] );
把這個封起來湃缎,做成一個函數(shù),然后監(jiān)測如果加載了include插件蠢壹,并且include插件并沒有完成所有加載嗓违,那么將這個回調(diào)傳給include插件
否則執(zhí)行
另外一部分就是在include中處理了,這里不多講
主要是等待图贸,這個簡單到不行蹂季,做一個計數(shù)器,javascript又沒有線程問題疏日,直接加減就可以了
稍微注意一下的是偿洁,我做異步加載使用的是script標(biāo)簽形式,這有幾個好處沟优,第一是這個異步涕滋,第二個是這個能跨域
但是這個也會有個問題,兼容性問題挠阁,直接使用原生的技術(shù)就會遇到這種狗屁的問題
在ie8下宾肺,標(biāo)簽沒有l(wèi)oad事件,只有一個readystatechange事件(這個事件會相應(yīng)超過一次侵俗,需要判斷狀態(tài)值锨用,跟xhr差不多,不過狀態(tài)沒有那么多就是了)坡慌,所以需要注冊兩種事件
but
恩黔酥,萬事萬物都有一個but。洪橘。跪者。
but?ie9尼瑪支持兩種事件,所以這里需要稍微注意一下
..............................end.........................