`document.write`是否适合查找与当前运行的脚本相关的元素?

Dag*_*bit 11 html javascript dom

如何找到与当前运行的脚本关联的脚本元素?我只对文档正文中的脚本感兴趣,而不是在头部(或其他地方).

这是我到目前为止,它似乎工作正常.我有没有想到的任何陷阱?

function getCurrentScriptElement() {
    var placeholderId = 'placeholder-' + Math.random(), 
        script, placeholder;
    document.write('<br id="' + placeholderId + '">');
    placeholder = document.getElementById(placeholderId);
    script = placeholder.previousSibling;
    placeholder.parentNode.removeChild(placeholder);
    return script;
}
Run Code Online (Sandbox Code Playgroud)

我想到的用例涉及需要在脚本标记出现的文档中的相同位置注入内容的脚本,因此延迟加载不会成为问题.换句话说,我只会在适当的地方调用此函数,它不会作为API或任何东西的一部分公开.

我也知道XHTML 的问题,document.write在这种情况下我并不担心(到目前为止).


我以前的尝试看起来像这样:

function getCurrentScriptElement() {
    var scripts = document.getElementsByTagName('script');
    return scripts[scripts.length - 1];
}
Run Code Online (Sandbox Code Playgroud)

但是,正如我们在这个问题中看到的,如果将另一个脚本注入到文档中,这很容易失败.


我也在WHATWG规范中找到document.currentScript了.目前似乎没有得到广泛支持.有一个有趣的垫片需要另一条路线 ...脚本触发错误,捕获它,检查堆栈跟踪以找到脚本的URL,然后找到具有匹配属性的脚本元素.document.currentScriptsrc

这是一个聪明的解决方案,但它显然无法在IE中运行,如果多个脚本使用相同的URL,它将会中断.


理想情况下,我想找到一个解决方案,它提供与顶级代码示例相同的结果(没有额外要求),但不依赖于document.write.这可能吗?如果没有,假设它正确使用(仅在页面加载期间,而不是XHTML),此代码是否相当安全?


编辑:请参阅此答案以了解另一个可能的用例,以及有关br元素用于占位符的原因的详细信息.

Reh*_*nis -2

另一个想法:根据 w3schools,该<script>标签支持全局 HTML 属性

使用任何全局属性 ( id, class, title) 您可以区分所使用的脚本标记,尽管在这种情况下您必须预先定义idclass

  • 虽然你的回答没有任何问题,但它并不是真正的问题所在。 (3认同)