safari里如何獲取當前正在執行js文件路徑?
01-26
動態批量append(script)方式載入人js文件。
safari里如何獲取當前正在執行js文件路徑?
較新的Chrome和FF支持document.currentScript,不過Safari不支持。
Safari可以用document.scripts[document.scripts.length - 1],不過如果有async/defer就不準了。一個hack的方式是取new Error().stack,獲得文件名,然後遍歷scripts找到url與其相符的那個。
可以看 sea.js 里源碼:https://github.com/seajs/seajs/blob/master/src/util-request.js#L136
利用js單線程的特性,當script對象的load事件觸發時,獲取到的script一定是當前正在執行的腳本。不幸的是IE9及以下版本不鳥load事件(相當於在當前線程插入了一個掛載點),靠得的是readystatechange,這個事件有5個狀態,當進行到loaded或者complete狀態時,其原理類似load,不幸的是這兩個狀態的掛載點在當前線程最末端,而因此達不到要求,但是處於intetactive狀態的script一定是當前正在執行的腳本(遍歷即可)。so,到此一個兼容性的方案形成了。
問題的關鍵是不要被currentScript的概念引入歧途。
可能是時間太久了記憶有點模糊了,如果onload是在內容之後執行,那麼require.js的做法是內容執行時註冊一個匿名module,然後在onload里再給module命名,這樣就不能滿足題主的需求了
可以利用script節點的onload事件.
說說require.js的做法
1.在append script 的時候,給script添加標記屬性比如&
2.在script節點上添加onload事件
在onload事件的回調中獲取到事件目標script節點上存放的qname,存入隊列,這樣就能確切知道每個js文件的載入順序了.3.在js文件執行的代碼中按順序取出自己的qname, 然後src屬性怎麼拿就不用解釋了吧.
利用到的原理就是onload回調的順序和js內容執行的順序一定是一致的, 並且onload在內容之前執行
推薦閱讀:
※電腦剛剛在中國普及時,大家的生活產生了哪些變化?
※女生怎樣學會安裝電腦系統?
※能否通俗地解釋或者是舉例說明交換機是做什麼用的?
※只會做加法的CPU如何將二進位文件和字母,圖片,聲音,甚至視頻聯繫起來?
TAG:JavaScript | 計算機 |