【问题标题】:Relative urls for Javascript filesJavascript 文件的相对 URL
【发布时间】:2008-09-20 17:44:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript html url


    【解决方案1】:

    为此,我喜欢将<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;
    

    【讨论】:

    • 这是一个很好的使用链接标签。
    • 我正在制定一个解决方案,通过所有脚本标签并找到我自己的脚本,然后是与此相关的东西。不过这要容易得多。
    • 如果你真的想要jQuery版本,$("#link-action-1")[0].href
    【解决方案2】:

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

    【讨论】:

    • 这对我没有用,因为我需要找到 webapp 根目录,它可能因服务器而异(在这种情况下是开发人员的机器设置)。
    • webapp 使用哪种服务器端技术?
    • apache、php 和 ez-publish 在这种情况下。但是,我想要一些纯 javascript 中的东西,无论使用 servseride 技术,它都能正常工作。
    【解决方案3】:

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

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

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

    【讨论】:

    【解决方案4】:

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

    考虑到这种方法会发生文件名冲突。

    【讨论】:

    • 酷。但是,这会在没有 src 属性的脚本上中断。如果您将条件调整为if( src &amp;&amp; src.match(re)),它会起作用。感谢您的代码!
    • 不错的解决方案。这有多可靠/跨浏览器?
    【解决方案5】:

    我在我的库主入口点 (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>
    

    我想后者会更快。

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2011-08-18
      • 2011-08-07
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多