2008-09-20 71 views
18

我在JavaScript文件中有一些代碼需要將查詢發送回服務器。問題是,如何找到我所在的腳本的URL,以便我可以爲ajax構建適當的請求url。JavaScript文件的相對URL

即,/,/help,/whatever等包含相同的腳本,而它總是需要從/data.json請求。此外,同一站點在不同的服務器上運行,其中/-文件夾的放置位置可能不同。我有辦法解決我包含JavaScript(ez-publish模板)的相對url,但不在javascript文件本身中。

是否有小腳本可以在所有瀏覽器上使用?

回答

23

爲此,我想將<link>元素放在頁面的<head>中,其中包含用於請求的URL。他們可以通過你的服務器端語言生成,使他們始終指向正確的觀點:

<link id="link-action-1" href="${reverse_url ('action_1')}"/> 

成爲

<link id="link-action-1" href="/my/web/root/action-1/"/> 

,並且可以通過JavaScript一起進行檢索:

document.getElementById ('link-action-1').href; 
+0

當然啊。似乎我錯過了最簡單的答案:)。 – Staale 2008-09-20 18:14:14

3

document.location.href會給你當前的URL,然後你可以使用JavaScript的字符串函數來操作。

+0

這對我來說並非有用,因爲我需要找到webapp root,這可能因服務器而異(在本例中爲開發人員機器設置)。 – Staale 2008-09-20 17:52:32

+0

webapp使用哪種服務器端技術? – 2008-09-20 18:01:23

+0

apache,php和ez-publish在這種情況下。不過,我想要純JavaScript的東西,無論關於servseride技術,都可以工作。 – Staale 2008-09-20 18:06:15

3

有沒有辦法讓客戶端可以在不知道服務器配置的情況下確定webapp根目錄,而不需要服務器告知它。你可以嘗試一種選擇是使用基本元素head元素中,讓服務器生成動態地而不是硬編碼(所以它顯示了每個服務器相關的URL):

<base href="http://path/to/webapp/root/" /> 

所有網址將隨後被視爲相對於此。因此,您只需將您的請求發送到/data.json。但是,您需要確保應用程序中的所有其他鏈接都牢記這一點。

0

我包括我的庫下面的代碼的主入口點(main.php):

/** 
* Build current url, depending on protocal (http/https), 
* port, server name and path suffix 
*/ 
$site_root = 'http'; 
if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") 
    $site_root .= "s"; 
$site_root .= "://" . $_SERVER["SERVER_NAME"]; 
if ($_SERVER["SERVER_PORT"] != "80") 
    $site_root .= ":" . $_SERVER["SERVER_PORT"]; 
$site_root .= $g_config["paths"]["site_suffix"]; 

$g_config["paths"]["site_root"] = $site_root; 

$ g_config是包含配置選項的全局數組。因此,site_suffix在開發框中可能類似於:「/ sites_working/thesite/public_html」,而在具有虛擬主機(域名)的服務器上只是「/」。

這種方法也很好,因爲如果有人鍵入開發框的IP地址,它將使用相同的IP地址來構建javascript文件夾的路徑,而不是像「localhost」之類的東西,如果您使用「localhost」它將使用「localhost」來構建URL。

而且由於它還檢測SSL,所以如果您曾向服務器添加SSL支持,則不必擔心天氣情況,您的資源將通過HTTP或HTTPS發送。

然後,在你的模板,或者使用

<link id="site_root" href="<?php echo $g_config["paths"]["site_root"] ?>"/> 

或者

<script type = "text/javascript"> 
var SiteRoot = "<?php echo $g_config["paths"]["site_root"]; ?>"; 
</script> 

我想後者會更快。

2

如果腳本知道它自己的文件名,則可以使用文檔。 getElementsByTagName()。遍歷列表,直到找到與您匹配的腳本,然後以這種方式提取完整(或相對)網址。

下面是一個例子:

function getScriptUrl (name) { 
    var scripts = document.getElementsByTagName('script'); 
    var re = RegExp("(\/|^)" + name + "$"); 
    var src; 
    for(var i = 0; i < scripts.length; i++){ 
     src = scripts[i].getAttribute('src'); 
     if(src.match(re)) 
      return src; 
    } 
    return null; 
} 

console.log('found ' + getScriptUrl('demo.js')); 

考慮到這種做法是受到碰撞名。