Javascript文件的相对URL
我在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>
我想后者会更快。