2008-09-20 38 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')); 

考虑到这种做法是受到碰撞名。