【问题标题】:Equivalent of PHP's dirname(__FILE__) in JavaScript?相当于 JavaScript 中 PHP 的 dirname(__FILE__)?
【发布时间】:2012-10-23 18:07:05
【问题描述】:

正如我在标题中已经提到的,我正在寻找一个 JS 函数来获得与此 PHP 代码相同的结果:

dirname(dirname(__FILE__))

提前致谢!

【问题讨论】:

  • 你想得到什么的第二个父目录? HTML 文件? javascript代码在哪里?用户文件系统上的文件?为什么?
  • 它不可用...至少不像在 PHP 中那样。
  • @lan: 我想获取文件的路径,因为我需要变量“root_dir”。在 PHP 中我这样做:define("ROOT_DIR", dirname(dirname(FILE)) . DIRECTORY_SEPARATOR);
  • 好的,请问您为什么需要它?

标签: php javascript dirname


【解决方案1】:

我认为这是不可能的,因为 php dirname 在本地机器上的 apache 服务器上运行。它可以访问文件系统。但是 javascript 在不能与文件系统一起操作的浏览器层上运行。我认为您应该使用 ajax 并根据需要处理结果。我认为这对你来说是最好的解决方案。

【讨论】:

    【解决方案2】:

    我需要一个解决方案来编写这样的代码:

    $("#div").load(ROOT_URL + "my/path/to/script.php");
    

    解决方案:PHP 脚本生成一个包含所有需要的 JS 文件的 JS 文件,并将 ROOT_URL 添加到生成文件的顶部:

    $js = 'ROOT_URL = "' . ROOT_URL . '"; ' . $js;
    file_put_contents("file.js", $js);
    

    现在我也可以在 JS 代码中使用 ROOT_URL(在 PHP 配置文件中设置)。希望能帮上忙。

    【讨论】:

      【解决方案3】:

      您可以让 PHP 输出脚本。是的,没错,你可能无法让 php 处理 js 文件(除非你完全控制了服务器)。但这没关系。只需确保在 PHP 返回的标头和脚本标记中的 MIME 类型都是正确的。这样,您可以让 PHP 在脚本中插入您想要的任何值,包括它自己的路径。

      在script.php中:

      header("Content-type: text/javascript");
      echo 'var myvar = '.$something;
      //where $something can be $_SERVER['REQUEST_URI'], __FILE__ or whatever you need.
      //You could even use information from session variables, or query the database.
      //In fact, this way you can have GET parameters in your javascript.
      //Make sure you are not creating a vulnerability with the exposed information.
      
      //Then put the rest of the script as usual. You could even include it*.
      

      *:include

      在 HTML 中:

      <script type="text/javascript" src="script.php"></script>
      

      是的,我知道我在重复 MIME 类型,这样做可以最大限度地提高浏览器兼容性。

      【讨论】:

        【解决方案4】:

        浏览器 Javascript 中没有 __FILE__ 的类似物;该代码无法直接访问加载它的 URL。但是通过某些假设,您可以弄清楚,如答案here

        一旦您有了脚本的 URL(我假设在下面名为 scriptURL 的变量中),您就可以着手查找祖父 URL。这对于 URL 来说可能会变得很棘手,因此让精通 URL 的 Javascript 为您解析 URL 并在开始使用字符串处理之前只获取路径名组件可能是最安全的:

        var a = document.createElement('a')
        a.href = scriptURL
        var scriptPath = a.pathname
        

        那么不幸的是字符串操作;这是一个有点笨拙的解决方案:

        var components = scriptPath.split(/\//)
        while (components.length > 0 && !components[components.length-1])
            components.length -= 1;
        var twoDirsUp = components.slice(0,components.length-2).join('/')
        

        然后您可以使用反向锚元素技巧将结果转换回完整的 URL:

        a.pathname = twoDirsUp;
        var grandParentUrl = a.href
        

        【讨论】:

          【解决方案5】:

          为什么不从绝对 URL 加载你想要的?

          如果您有代码块:/my/script/to/load.js 浏览器将加载正确的文件,如果您在 yoursite.com 或类似 yoursite.com/a/b/c/d/e/f 的任何地方

          【讨论】:

          • 很遗憾没有。我使用具有未知/动态深度的重写 URL (domain.com/controller/action/arg1/arg2/arg3/...)。对于 JS,它看起来像是在文件夹“arg3”中。这就是为什么我需要绝对 URL 来修复它的原因。如果您有其他解决方案,请告诉我! :-)
          • @Mr.Bombastic 你有网站/测试网站吗?
          【解决方案6】:

          有点离题,但如果你只是想获得类似 dirname($_SERVER['REQUEST_URI']) 的 javascript,你可以这样做

          window.location.href.substr(0, window.location.href.length - window.location.href.split('/').pop().length)
          

          【讨论】:

            【解决方案7】:

            我使用类似的东西来摆脱 javascript 中的路径

             var __DIR__ = window.location.pathname.match('(.*\/).*')[1] + 'NameOfThisFolder';
            

            第一

            window.location.pathname.match('(.*\/).*')[1]
            

            返回当前路径,不包含文件名或其他内容。

            rootFolder/folder1/folder2/
            

            然后我添加此文件夹的名称 ('NameOfThisFolder')。

            通过这种方式,我可以在当前页面中从 ajax 请求依次调用的页面发出 ajax 请求,而无需担心路径

            【讨论】:

              猜你喜欢
              • 2014-02-26
              • 1970-01-01
              • 2012-06-21
              • 2011-02-14
              • 1970-01-01
              • 1970-01-01
              • 2014-02-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多