【发布时间】:2013-01-19 03:14:58
【问题描述】:
如何找到与当前正在运行的脚本关联的脚本元素?我只对文档正文中的脚本感兴趣,而不是在头部(或其他地方)。
这是我目前所拥有的,它似乎工作正常。有没有我没有想到的潜在陷阱?
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;
}
我为此考虑的用例涉及需要在文档中出现脚本标记的同一位置注入内容的脚本,因此延迟加载不会成为问题。换句话说,我只会在适当的地方调用这个函数,它不会作为 API 或任何东西的一部分公开。
我也知道problem 与document.write 和XHTML,在这种情况下我并不担心(到目前为止)。
我之前的尝试是这样的:
function getCurrentScriptElement() {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length - 1];
}
但是,正如我们在 this question 中看到的那样,如果将另一个脚本注入到文档中,这很容易失败。
我还在这个WHATWG spec 中找到了document.currentScript。在这一点上,它似乎没有得到广泛的支持。 document.currentScript 有一个有趣的 shim,它采用 another route... 脚本触发错误,捕获它,检查堆栈跟踪以找到脚本的 URL,然后找到具有匹配 src 属性的脚本元素.
这是一个聪明的解决方案,但它显然无法在 IE 中运行,并且如果多个脚本使用相同的 URL,它会中断。
理想情况下,我想找到一个与顶部代码示例给出相同结果的解决方案(没有额外要求),但不依赖于document.write。这可能吗?如果没有,假设正确使用此代码是否相当安全(仅在页面加载期间,而不是 XHTML)?
编辑:请参阅this answer 了解另一个潜在用例,以及为什么将br 元素用于占位符的详细信息。
【问题讨论】:
-
如果代码在 DOM 加载后运行,
document.write将替换整个文档。 -
加载文档后它没有运行...有关它如何运行的示例,请参阅链接的问题。仍在编辑这个问题。
-
这是另一个相关问题,也许这就是您要找的:stackoverflow.com/questions/5261300/…。
-
@JaredFarrish 查看此问题底部链接的问题的答案...在加载之前触发 JSONP 请求或类似请求的其他内容可能会搞砸。
-
如果没有类似于
script.placeholder标签上的类或其他内容,您似乎坚持使用document.write。
标签: javascript html dom