[英]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.