簡體   English   中英

Javascript文件的相對URL

[英]Relative urls for Javascript files

我在javascript文件中有一些代碼需要將查詢發送回服務器。 問題是,我如何找到我所在腳本的URL,因此我可以為ajax構建一個正確的請求URL。

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

是否有適用於所有瀏覽器的小腳本?

為此,我喜歡將<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;

document.location.href將為您提供當前URL,然后您可以使用JavaScript的字符串函數進行操作。

客戶端無法在沒有被服務器告知的情況下確定webapp根目錄,因為它不知道服務器的配置。 您可以嘗試的一個選項是使用head元素內的基本元素,讓服務器動態生成它而不是硬編碼(因此它顯示了每個服務器的相關URL):

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

然后將所有URL視為相對於此。 因此,您只需向/data.json發出請求即可。 但是,您需要確保應用程序中的所有其他鏈接牢記這一點。

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

這是一個例子:

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') );

考慮到這種方法受文件名沖突的影響。

我在我的庫主入口點(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>

我想后者會更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM