Javascript文件的相对URL

时间:2020-03-06 14:29:22  来源:igfitidea点击:

我在javascript文件中有一些代码,需要将查询发送回服务器。问题是,如何找到我所在脚本的URL,以便为Ajax构建适当的请求URL。

也就是说,相同的脚本包含在// help/ whatever等上,而始终需要从/ data.json请求。另外,同一站点在不同的服务器上运行,其中/文件夹可能放置在不同的位置。我有办法解析包含我的Javascript(ez-publish模板)的相对URL,但不在JavaScript文件本身内。

是否有小脚本可以在为此创建的所有浏览器上运行?

解决方案

document.location.href将为我们提供当前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;

客户端无法在不通知服务器的情况下确定webapp根目录,因为它不知道服务器的配置。我们可以尝试的一种选择是使用head元素内的base元素,使服务器动态地生成它,而不是对其进行硬编码(因此它显示每个服务器的相关URL):

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

然后,所有URL都将被视为相对于此。因此,我们只需向/data.json发出请求即可。但是,我们确实需要确保应用程序中的所有其他链接都牢记这一点。

我在库的主要入口点(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地址而不是" localhost"来构建javascript文件夹的路径,如果使用" 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>

我想后者会更快。