2010-02-17 63 views
9

所以我試圖加載一個腳本動態並找出該腳本加載的URL路徑。因此,如果腳本靜態加載(How to get the file-path of the currently executing javascript code),某個人給了我一個非常棒的解決方案。但我需要一個動態加載的解決方案。例如:動態加載時獲取當前正在執行的js文件的url

$(function() 
{ $.getScript("brilliant.js", function(data, textStatus) 
    { // do nothing 
    }); 
}); 

其中 「brilliant.js」 有:

var scripts = document.getElementsByTagName("script"); 
var src = scripts[scripts.length-1].src; 
alert("THIS IS: "+src); 

理想這應該是打印出 「brilliant.js」 或 「⟨主機+基本路徑⟩ /brilliant.js」

當前,brilliant.js適用於靜態包含的腳本,但不適用於動態包含的腳本(如使用$ .getScript)。有人有主意嗎? dom中是否有存儲所有已加載腳本的地方?

編輯:安德拉斯給出了一個很好的解決方案,雖然它可能只適用於jQuery。因爲這可能是最受歡迎的圖書館,而且肯定是我將要使用的。它可能也可以擴展到其他庫。這是我的簡化版本:

var scriptUri; 
curScriptUrl(function(x) 
{ scriptUri = x; 
    alert(scriptUri); 
}); 

function curScriptUrl(callback) 
{ var scripts = document.getElementsByTagName("script"); 
    var scriptURI = scripts[scripts.length-1].src; 

    if(scriptURI != "")   // static include 
    { callback(scriptURI); 
    }else if($ != undefined) // jQuery ajax 
    { $(document).ajaxSuccess(function(e, xhr, s) 
     { callback(s.url); 
     }); 
    } 
} 
+0

我喜歡什麼chamiltongt(下面)說,ajax在代碼中,然後eval()它。爲了使其能夠普遍訪問,爲什麼不設置一個微型服務器來提供您的.js代碼。這將是集中的,你可以立即爲每個用戶更新你的代碼。 – logout

回答

8

當你的腳本使用jQuery加載(並且我猜其他框架也是如此)時,你的腳本將與最初在HTML文檔中的腳本無法區分。

jQuery爲您的腳本提出請求,並將回覆作爲<腳本>節點的文本孩子放回。你的瀏覽器無法知道它來自哪裏,它是否在插入之前被修改過等等。就她而言,它只是一個腳本節點。

但是可以有解決方法。就jQuery而言,您可以連接到ajax事件並利用它們在腳本執行後立即被調用的事實。基本上,這會產生「brilliant.js」在你的例子:

var handler = function (e, xhr, s) { 
    alert(s.url); 
} 

$(document).ajaxSuccess(handler); 

一個更詳盡的一個:

(function ($, undefined) { 

    /* Let's try to figure out if we are inlined.*/ 
    var scripts = document.getElementsByTagName("script"); 

    if (scripts[scripts.length - 1].src.length === 0) { 
     // Yes, we are inlined. 
     // See if we have jQuery loading us with AJAX here. 
     if ($ !== undefined) { 
      var initialized = false; 
      var ajaxHandler = function (e, xhr, s) { 
       if (!initialized) { 
        initialized = true; 
        alert("Inlined:" + s.url); 
        initmywholejsframework(); 
       } 
      } 

      //If it is, our handler will be called right after this file gets loaded. 
      $(document).ajaxSuccess(ajaxHandler); 

      //Make sure to remove our handler if we ever yield back. 
      window.setTimeout(function() { 
       jQuery(document).unbind("ajaxSuccess", ajaxHandler); 
       if (!initialized) { 
        handleInlinedNonjQuery(); 
       } 
      }, 0); 

     } 
    } else { 
     //We are included. 
     alert("Included:" + scripts[scripts.length - 1].src); 
     initmywholejsframework(); 
    } 

    //Handle other JS frameworks etc. here, if you will. 
    function handleInlinedNonjQuery() { 
     alert("nonJQuery"); 
     initmywholejsframework(); 
    } 

    //Initialize your lib here 
    function initmywholejsframework() { 
     alert("loaded"); 
    } 

})(jQuery); 
+0

很酷的解決方法。我希望有一種更普遍的方式來解決這個問題 - 但看起來這只是最好的。我上面編輯了我的問題以顯示我的版本。 –

-1

B T,對不起,如果這沒有幫助,但我很好奇你爲什麼需要這樣做?我問的原因是我不明白爲什麼你不能使用相對文件路徑來加載這些文件?通過window.location查找你所在的位置,但你爲什麼要這樣做?至於加載它們,你不能對文件進行ajax調用,然後評估它們嗎?

+0

另外,我只記得一種更簡單的方法,可以動態地將腳本元素添加到頁面中。以下是如何做到這一點的鏈接 - > http://www.codehouse.com/javascript/articles/external/ – chamiltongt

+0

我正在製作一個JavaScript庫,目的是由外部域加載。這不是關於簡單的JavaScript文件的問題。如果你想有更多的上下文,請看下面的鏈接,謝謝:http:// stackoverflow。com/questions/2255689 /如何獲得文件路徑的正確執行的JavaScript代碼。 –

+0

爲ajax和eval()的想法+1 :) – logout

-1

這將在每一個瀏覽器的工作,除了IE,並且不依賴於假設什麼一個文件的名稱是:

var getErrorLocation = function (error) { 
    var loc, replacer = function (stack, matchedLoc) { 
     loc = matchedLoc; 
    }; 

    if ("fileName" in error) { 
     loc = error.fileName; 
    } else if ("stacktrace" in error) { // Opera 
     error.stacktrace.replace(/Line \d+ of .+ script (.*)/gm, replacer); 
    } else if ("stack" in error) { // WebKit 
     error.stack.replace(/at (.*)/gm, replacer); 
     loc = loc.replace(/:\d+:\d+$/, ""); // remove line number 
    } 
    return loc; 
}; 

try { 
    0(); 
} catch (e) { 
    var scriptURI = getErrorLocation(e); 
} 

alert("THIS IS: " + scriptURI); 
+0

他正在使用$ .getScript()加載腳本,這相當於在沒有src屬性的情況下追加

  • 11. 如何獲取當前正在執行的javascript代碼的文件路徑
  • 12. 在global.asa中獲取當前正在執行的網頁的AppFriendlyName?
  • 13. 如何在powershell函數中獲取當前正在執行的文件
  • 14. JavaScript監聽器捕獲當前正在加載資源的URL
  • 15. 在ajax中動態加載js文件
  • 16. 獲取正在運行的java文件的當前路徑
  • 17. 如何動態加載帶有屬性的js文件並在加載時執行回調?
  • 18. 獲取正在加載的文件Javascript
  • 19. Angular JS - $ http的動態URL獲取
  • 20. Mbunit - Gallio。獲取當前正在執行的測試的名稱
  • 21. Ruby:獲取定義當前正在執行的代碼的類
  • 22. 如何獲取當前正在執行的代碼的HMODULE?
  • 23. 獲取當前正在執行的方法的名稱
  • 24. 如何獲取當前正在執行的DLL的位置?
  • 25. 獲取當前正在執行的測試測試的名稱?
  • 26. 獲取當前正在執行的存儲過程的句柄
  • 27. 有沒有辦法從sqlcmd獲取當前正在執行的文件?
  • 28. 如何在iframe中運行動態加載的js文件?
  • 29. 獲取當前正在執行的當前線程的方法名稱
  • 30. 在動態加載的內容中執行JS