JS獲取當(dāng)前腳本文件的絕對(duì)路徑

字號(hào):


    當(dāng)寫模塊加載器時(shí),獲取當(dāng)前腳本文件的絕對(duì)路徑作為基礎(chǔ)路徑是必不可少的一步,下面我們一起來(lái)探討一下這個(gè)問(wèn)題吧!
    一、各大瀏覽器的實(shí)現(xiàn)方式                
    [a]. Chrome和FF
    超簡(jiǎn)單的一句足矣!
    var getCurrAbsPath = function(){
     return document.currentScript.src;
    };
    這里利用了對(duì)象 document.currentScript ,它返回的是當(dāng)前執(zhí)行的script元素;然后調(diào)用script元素的src屬性即可獲取腳本文件的絕對(duì)路徑。
    [b]. IE10+、Safari和Opera9
    利用Error對(duì)象的stack屬性(IE10+)、sourceURL屬性(Safari)和stacktrace屬性(Opera9)萃取絕對(duì)路徑
    var getCurrAbsPath = function(){
      var a = {}, stack;
      try{
       a.b();
      }
      catch(e){
       stack = e.stack || e.sourceURL || e.stacktrace; 
      }
      var rExtractUri = /(?:http|https|file):\/\/.*?\/.+?.js/, 
        absPath = rExtractUri.exec(stack);
      return absPath[0] || '';
    }; 
      [C]. IE5.5~9
    遍歷文檔中的script標(biāo)簽
    var getCurrAbsPath = function(){
      var scripts = document.scripts;
      var isLt8 = ('' + document.querySelector).indexOf('[native code]') === -1;
      for (var i = scripts.length - 1, script; script = scripts[i--];){
        if (script.readyState === 'interative'){
         return isLt8 ? script.getAttribute('src', 4) : script.src;  
        }
      }
    };
    二、相關(guān)知識(shí)介紹                      
    IE5.5~9下script的readyState表示該script元素的狀態(tài),分別有以下的狀態(tài)值:
    uninitialized:未初始化
    loading:正在加載
    loaded:加載完成
    interative:執(zhí)行中
    complete:執(zhí)行完
    可通過(guò)訂閱onreadystatechange事件來(lái)監(jiān)聽(tīng)script元素狀態(tài)的變化。但不幸的是loaded和complete狀態(tài)并出現(xiàn)順序不定且有可能僅出現(xiàn)其中一個(gè),因此建議在動(dòng)態(tài)添加script元素時(shí),先設(shè)置src屬性后再將script元素添加到DOM樹中,這樣loaded和complete狀態(tài)僅會(huì)出現(xiàn)其中一個(gè)(雖然每次請(qǐng)求時(shí),哪個(gè)出現(xiàn)是不定的),比較好監(jiān)測(cè)。
    三、IE和FF下的另一種方式                
    通過(guò)訂閱 window.onerror 事件,事件處理函數(shù)將接受三個(gè)參數(shù),分別是msg,url和num。這里url就是當(dāng)前腳本的絕對(duì)路徑了。
    以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。