2009-12-07 79 views
2

如何獲取包含的JavaScript文件的絕對路徑或站點相對路徑。包含Javascript的路徑頁面

我知道這可以在PHP中完成,(__file__,我想)。即使是包含頁面,也可以檢查路徑(包含文件)。有沒有什麼辦法讓這種自我意識在JavaScript?

我知道我可以獲取頁面URL,但需要獲取JS URL。

EG。 JavaScript需要修改頁面上圖像的src。 我知道圖像與JavaScript文件的相對位置。我不知道Javascript是相對於頁面的。

<body> 
    <img id="img0" src=""> 
    <script src="js/imgMaker/myscript.js"></script> 
</body> 

function fixPath(){ 
    $$("#img0")[0].set('src','js/imgMaker/images/main.jpg'); 
} 

請不要告訴我調整自己的功能 - 的例子被簡化解釋的必要。 在實際情況下,正在分發Mootools類,並且人們可以將其放入任何他們想要的文件夾中。

我只是讀取腳本元素的src,但該類可以是任何數量的javascript文件的一部分,所以我不知道該元素的外觀。

回答

3

的JavaScript(的JScript)沒有文件名的概念。它是在幾天前爲Netscape開發的。因此有沒有__file__功能或類似的東西。

你能來最接近的是這兩種可能性:

  1. 你已經提到什麼:收穫所有的JS文件的所有src屬性,並試圖找出哪一個是正確的。

  2. 使其成爲必要的選項,必須在嵌入HTML文件中設置圖像的路徑。如果沒有設置,使用合理和充分證明默認:


<script type="text/javascript"> 
var options = { 
    'path_to_images': '/static/images/' // defaults to '/js/img/' 
}; 
</script> 
+0

這可以在Jscript中完成嗎?或許我應該添加一個小片段來捕捉IE,至少? – SamGoody 2009-12-07 09:54:03

+0

不,我只是提到過,因爲您可以在Windows機器上執行JScr​​ipt文件,並且您可以通過所謂的Windows Script Host訪問文件。在IE中也沒有運氣,對不起。 – Boldewyn 2009-12-07 10:07:03

0

,如果您有文件夾:

/webroot 
    /images 
    /scripts 

然後圖像會/images/whatever.jpg的絕對路徑和腳本將/scripts/js.js

+0

沒錯。我將劇本分發給1,000,000人。一些會有一個名爲腳本的文件夾,一些會有一個名爲js的文件夾,有些則不會有文件夾。我知道圖像與腳本文件的相對位置。但我沒有腳本文件的路徑。我如何獲得? – SamGoody 2009-12-07 09:23:39

+0

我知道圖像與腳本相關的位置,因爲我正在分發包含文件和圖像的文件夾,並且我告訴他們必須將該文件夾原樣複製到其服務器中。但是他們可以將文件夾放在服務器上的任何位置,只要他們將腳本包含在他們的頁面中即可。 – SamGoody 2009-12-07 09:24:54

0

路徑的絕對路徑到JS是無關緊要的;即使您從外部JS修改它們,HTML文件中的鏈接也始終是相對於HTML文件的。

[編輯]如果你需要建立相對於當前網頁的路徑,你可以找到它的document.location.pathname路徑。這個路徑是相對於web根目錄的,但你應該能夠找到一個已知的子路徑,然後從那裏開始工作。

例如,對於此頁面,它pathname將是/posts/1858724。你可以找posts,然後從那裏建立一個相對路徑(例如posts/../images/smiley.png

+1

這對於JS來說是正確的,但對於CSS來說則是如此。 CSS文件中的鏈接與CSS文件相關,而不是HTML文件。 – Marius 2009-12-07 08:58:08

+0

這就是要點!再說一遍:我知道圖像與JavaScript文件相關的位置。我不知道Javascript是相對於頁面的。由於我將插入到頁面的路徑必須是相對頁面,我需要知道JavaScript文件的路徑才能創建正確的路徑! – SamGoody 2009-12-07 09:21:38

+0

哦,這很簡單:您可以在document.location.pathname中找到頁面的路徑它與web根目錄相對,但您應該能夠找到已知的子路徑,然後從那裏開始工作。 – 2009-12-07 13:26:16

0

我用下面的方法來獲取基本URL,並使用它加載其他prorotypes,也許這是你需要的。讓我們說當前的腳本名稱是'clone.js'。

/* 
    * get the base URL using current script 
    */ 

    var baseURL = ''; 
    var myName = 'clone.js'; 
    var myPattern = /(^|[\/\\])clone\.js(\?|$)/; 

    var scripts = document.getElementsByTagName("script"); 

    for (var i = 0; i < scripts.length; i++) { 
     var src; 
     if (src = scripts[i].getAttribute("src")) { 
      if (src.match(myPattern)) { 
       baseURL = src.replace(myName, ''); 
       break; 
      } 
     } 
    } 

瓦爾基本URL應該包含你所需要的。基於

2

http://ejohn.org/blog/file-in-javascript/

(function(){ 
    this.__defineGetter__("__FILE__", function() { 
    return (new Error).stack.split("\n")[2].split("@")[1].split(":").slice(0,-1).join(":"); 
    }); 
})(); 

(function(){ 
    this.__defineGetter__("__DIR__", function() { 
    return __FILE__.substring(0, __FILE__.lastIndexOf('/')); 
    }); 
})(); 

再後來

img.setAttribute('src', __DIR__ + '/' + file); 
+0

這很酷。不幸的是它只適用於FF。 – Boldewyn 2009-12-07 10:38:14

0

我知道這個問題被問一段時間回來,但我也有類似的情況,山姆。

在我的情況,我有兩個原因的情況:

  1. 用戶可以訪問不同的子域,每個都有自己的索引頁。
  2. 用戶可以輸入一個導致index.php來調整路徑的密碼。

大多數參考文獻指向腳本的相同src位置,但有些不。例如,樹中不同級別的人需要不同的路徑。

我通過給索引頁面的腳本標籤分配一個id來解決這個問題。例如,頭部可能包括...

<script id='scriptLocation' type='text/javascript' language='javascript' src='../scripts.test/script.js'></script> 

我的JavaScript就能夠讀取路徑...

var myPath = document.getElementById("scriptLocation").src; 
0

找到另一種方法,也許有人更JS忍者可以刷新這一點。

CSS樣式表能夠找到使用document.stylesheets.ownernode調用它們的節點。

我找不到類似的JavaScript文件調用。

但是,在某些情況下,如果可以將CSS文件與javascript一起包含,併爲第一個規則提供一些唯一標識符。 可以遍歷所有樣式表,直到找到具有標識符[if(document.stylsheets [i] .cssRules [0] == thisIs:myCSS)]的標識符,然後使用ownerNode獲取該文件的路徑並假設JS也是一樣。

費解並且不是很有用,但它的另一種方法 - 可能會引發某人更好的想法。