safari里如何獲取當前正在執行js文件路徑?

動態批量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添加標記屬性比如

&

利用到的原理就是onload回調的順序和js內容執行的順序一定是一致的, 並且onload在內容之前執行


推薦閱讀:

電腦剛剛在中國普及時,大家的生活產生了哪些變化?
女生怎樣學會安裝電腦系統?
能否通俗地解釋或者是舉例說明交換機是做什麼用的?
只會做加法的CPU如何將二進位文件和字母,圖片,聲音,甚至視頻聯繫起來?

TAG:JavaScript | 計算機 |