18

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

即,相同的脚本包含在/, /help,/whatever等上,而它总是需要从/data.json. 此外,同一站点在不同的服务器上运行,其中/-folder 的放置方式可能不同。我有办法解析包含 Javascript(ez-publish 模板)的相对 url,但不在 javascript 文件本身中。

是否有适用于为此而设计的所有浏览器的小脚本?

4

5 回答 5

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;
于 2008-09-20T18:08:20.657 回答
3

document.location.href将为您提供当前 URL,然后您可以使用 JavaScript 的字符串函数对其进行操作。

于 2008-09-20T17:46:50.617 回答
3

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

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

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

于 2008-09-20T18:13:50.067 回答
2

如果脚本知道自己的文件名,则可以使用 document. 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') );

考虑到这种方法会受到文件名冲突的影响。

于 2011-08-29T21:05:07.627 回答
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>

我想后者会更快。

于 2008-09-20T18:39:54.543 回答