document.currentScript为null

zlo*_*ctb 13 javascript

浏览器是Chrome.应该支持document.currentScript

的index.html

<link href="css/main.css" rel="stylesheet" />
<script src="1.js"></script>
<style>
Run Code Online (Sandbox Code Playgroud)

1.js

setInterval(function(){


var fullUrl = document.currentScript.src;

console.log(fullUrl)
},2000)
Run Code Online (Sandbox Code Playgroud)

错误: 1.js:4未捕获的TypeError:无法读取null的属性'src'

And*_*y E 26

document.currentScript返回当前正在处理的脚本.在回调和事件,剧本已经完成正在处理中,document.currentScriptnull.这是故意的,因为保持引用处于活动状态会阻止脚本在从DOM中删除并删除所有其他引用时进行垃圾回收.

如果您需要在任何回调之外保留对脚本的引用,您可以:

var thisScript = document.currentScript;

setInterval(() => console.log(thisScript.src), 2000);
Run Code Online (Sandbox Code Playgroud)

  • 请务必在闭包中执行此操作以隔离“thisScript”。 (2认同)
  • 如果您想要的是“src”值,那么为什么不直接保存该值,而不是保存 DOM 中的整个 Script 对象呢?`var thisScriptSrc = document.currentScript &amp;&amp; document.currentScript.src;` (2认同)

Don*_*ark 9

document.currentScript如果脚本像这样作为模块加载,也将为空。

<script type="module" src="foo/bar.js"></script>
Run Code Online (Sandbox Code Playgroud)

对于模块,文档说import.meta.url应该使用。


Oli*_*ssé 6

您可以document.currentScript在回调之外保留参考

var currentScript = document.currentScript;

setInterval(function(){
    var fullUrl = currentScript.src;
    console.log(fullUrl)
},2000);
Run Code Online (Sandbox Code Playgroud)