代码之家  ›  专栏  ›  技术社区  ›  Staale

javascript文件的相对URL

  •  18
  • Staale  · 技术社区  · 17 年前

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

    也就是说,相同的脚本包含在 / , /help , /whatever 等等,尽管它总是需要 /data.json . 此外,同一站点在不同的服务器上运行,其中 / -文件夹的位置可能不同。我有方法解析包含javascript(ez发布模板)的相对URL,但不在javascript文件本身中。

    是否有小脚本可以在所有为此而设计的浏览器上工作?

    5 回复  |  直到 10 年前
        1
  •  23
  •   John Millikin    17 年前

    为了这个我喜欢放 <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;
    
        2
  •  3
  •   John Topley    17 年前

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

        3
  •  3
  •   Luke Bennett    17 年前

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

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

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

        4
  •  2
  •   Grae Kindel    14 年前

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

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

        5
  •  0
  •   community wiki nlaq    17 年前

    我在我的库主入口点(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是一个包含配置选项的全局数组。因此,站点后缀可能在您的开发框中显示为:“/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>
    

    我想后者会更快。

    推荐文章