擷取當前Javascript指令檔的路徑,javascript指令碼
擷取當前Javascript指令檔的路徑
擷取當前Javascript指令檔的路徑,在特定情境下可能需要,比如寫模組載入器,或者進行日誌記錄。並沒有統一的方法適用於所有瀏覽器,本文分幾種情況進行說明。
(1). 標準做法: document.currentScript 對象的src屬性
適用於Firefox 4+, Chrome 29+, Opera 16+, Safari 8+.
var src = document.currentScript.src;
(2). 從Error對象的stack屬性中提取檔案路徑
適用於IE10+, Safari 7-, Opera 15-.
var e = new Error('err');var stack = e.stack || e.sourceURL || e.stacktrace || '';var rgx = /(?:http|https|file):\/\/.*?\/.+?.js/, var src = (rgx.exec(stack)||[])[0] || '';
如果瀏覽器不支援Error建構函式,也可以通過try…catch來擷取一個Error對象。
監聽onerror事件,來對Error對象處理,原理也是如此。onerror事件的回呼函數的第2個參數就是src. 代碼就不貼了。
(3). 找document.scripts集合中的最後一個script元素的src
適用於指令碼載入過程中執行的情況,不適用於指令碼初始化完成後的調用。對瀏覽器沒有要求。
var src = document.scripts[document.scripts.length - 1].src;
(4).尋找document.scripts集合中readyState屬性為interative的script元素的src
適用於IE9-. IE9以下瀏覽器中,script.readyState屬性為interative表示指令碼正在執行。
var scripts = document.scripts, src;for (var i = scripts.length - 1; i>=0; i--){ if (scripts[i].readyState === 'interative'){ src = scripts[i].src; break; }}
本文只是提供思路分析,如果需要在產品中使用,需要處理各種適用情形的判斷。有人製作了一個JS函數(getCurrAbsPath.js)來處理。