获取脚本路径

IT技术 javascript css
2021-03-09 22:24:43

在 CSS 中,任何图像路径都是相对于 CSS 文件位置的。

f.ex 如果我将 CSS 文件放入/media/css/mystyles.css并使用类似的东西

.background:url(../images/myimage.jpg);

浏览器将寻找/media/images/myimage.jpg有意义的图像

是否可以在 javascript 中做同样的事情?

F.ex 如果我包含/media/js/myscript.js并将此代码放在那里:

var img = new Image();
img.src = '../images/myimage.jpg';

找不到图像,因为浏览器使用 HTML 文件作为起点,而不是脚本位置。我希望能够使用脚本位置作为起点,就像 CSS 一样。这可能吗?

6个回答

<script>像上面一样在 DOM 中搜索你自己的标签是常用的方法,是的。

然而,您通常不需要太用力地搜索:当您在脚本主体中时——在包含时运行——您很清楚<script>自己是哪个元素:最后一个。其余的还不能解析。

var scripts= document.getElementsByTagName('script');
var path= scripts[scripts.length-1].src.split('?')[0];      // remove any ?query
var mydir= path.split('/').slice(0, -1).join('/')+'/';  // remove last filename part of path

function doSomething() {
    img.src= mydir+'../images/myimage.jpeg';
}

如果您的脚本已与<script defer>(或在 HTML5 中,<script async>链接,则这不成立然而,这目前很少使用。

异步加载变得越来越流行(也更容易),这是我绝对不会依赖的......
2021-05-05 22:24:43
可选地,您可以扫描所有脚本标签并查找带有您的脚本文件名的标签,但即使如此,也可能因为有人可能已将其重命名。
2021-05-09 22:24:43
如果我想获取在 html 中导入但具有不同泛化的一个脚本的目录名称怎么办?
2021-05-12 22:24:43
更常用的也存在问题的是动态(ajax)加载,因为包含的脚本运行然后被扔掉并且永远不会出现在scripts数组中
2021-05-14 22:24:43
不适用于defer脚本并且async也非常不可靠
2021-05-19 22:24:43

在较新的浏览器上,您可以使用该document.currentScript属性获取该HTMLScript脚本对应元素,然后查询其src属性。

在撰写本文时,Can I use表示 70% 的网络用户支持。显然 Internet Explorer 不支持它,但 Edge 支持。 MDC列出支持 Chrome 29+、Edge、Firefox 4.0+、Gecko 2.0+、Opera 16+ 和 Safari 8+。@mjhm评论已经指出了这个功能,但当时它听起来非常具有实验性。

根据“document.currentScript”中的注释,它似乎不再适用:“此 API 已在实施者和标准社区中失宠,因为它在全球范围内公开了脚本或 SVG 脚本元素......”
2021-04-28 22:24:43
@Stephan:已经做到了但其他阅读此答案的人可能也想做出贡献。
2021-05-08 22:24:43
“对于(ES6)module使用import.meta代替。” – MDN
2021-05-09 22:24:43
caniuse.com尚未监控此功能。您可以在此处帮助投票github.com/Fyrd/caniuse/issues/1099
2021-05-15 22:24:43
酷 :) 此功能本月获得 5 个赞。在要添加的功能列表中排名第 8。
2021-05-18 22:24:43

受上述 bobince 回答的启发,我编写了一个 jQuery 版本。这是一行中的代码:

var scriptpath = $("script[src]").last().attr("src").split('?')[0].split('/').slice(0, -1).join('/')+'/';

编辑:scriptsrc属性过滤标签,以便我们得到一个 src 来处理。

我编辑了你的单行字;您需要通过 src 属性(“script[src]”)过滤脚本标签,以防最后一个脚本是内联的。
2021-04-20 22:24:43

正如其他海报提到的,您需要先计算脚本的基本 url,您可以在下面的脚本中找到它。

// find the base path of a script
var settings = {};
settings.basePath = null;

if (!settings.basePath) {
  (function (name) {
    var scripts = document.getElementsByTagName('script');

    for (var i = scripts.length - 1; i >= 0; --i) {
      var src = scripts[i].src;
      var l = src.length;
      var length = name.length;
      if (src.substr(l - length) == name) {
        // set a global propery here
        settings.basePath = src.substr(0, l - length);

      }
    }
  })('myfile.js');
}

log(settings.basePath);
如果包含 2 个具有相同基名(但来自不同位置)的脚本,则失败。我知道这不太可能,但人们会期望有一个简单可靠的解决方案来处理这样一个基本的事情。
2021-05-01 22:24:43

对于异步脚本,脚本标记遍历不起作用。因此,如果: - performance.timing存在(例如在新的非 Safari 浏览器中)& 您尚未达到其最大值,或者在加载之前已推高其最大值 & 您的脚本是最新加载的内容:

performance.getEntries().slice(-1)[0].name 

要提高最大值,请执行以下操作:

performance.webkitSetResourceTimingBufferSize(10000)
嗨.. 是否有任何与浏览器性能相关的 resourceBufferSize 增加影响?
2021-04-26 22:24:43
有一点点内存用于日志记录,但我认为这对几乎每个客户端来说都是微不足道的
2021-05-12 22:24:43