是否有一种简单可靠的方法来确定当前正在执行的JavaScript文件的URL(在网页内)?
我唯一想到的是扫描DOM src以查找所有脚本属性以查找当前文件的引用方式,然后通过应用它来计算绝对URL document.location.任何人都有其他想法,是否有一些我完全忽略的超级简单方法?
更新:通过DOM访问的脚本元素已经具有src包含完整URL 的属性.我不知道它是多么普遍/标准,但是你可以使用getAttribute("src")哪个将返回[X] HTML中的任何原始属性值.
如何找到与当前运行的脚本关联的脚本元素?我只对文档正文中的脚本感兴趣,而不是在头部(或其他地方).
这是我到目前为止,它似乎工作正常.我有没有想到的任何陷阱?
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元素用于占位符的原因的详细信息.
我们将IE扩展实现为浏览器帮助对象(BHO).我们有一个用C++编写的实用程序函数,我们将其添加到页面的窗口对象中,以便页面中的其他脚本可以使用它来动态加载本地脚本文件.但是,为了解析这些本地脚本文件的相对路径,我们需要确定调用函数的JavaScript文件的路径:
myfunc() 用C++编写并暴露给页面的JavaScript从顶部框架我想获取脚本调用myfunc()位于file:///path/to/some/javascript.js的信息.
我首先期望我们可以简单地使用IActiveScriptDebug接口从我们的实用程序函数中获取堆栈跟踪.但是,似乎无法IActiveScript从IWebBrowser2接口或相关文档获取接口(请参阅IE8上的多帧JS的完全调用).
我唯一能想到的就是注册我们自己的脚本调试器实现并myfunc()进入调试器.但是,我怀疑这会在没有提示用户是否想要进入调试器的情况下工作.
在对这种方法进行更全面的测试之前,我想检查是否有人有关于这是否可行的确切信息和/或可以建议一种替代方法,该方法将使用C++编写的函数从脚本引擎获取堆栈跟踪调用它.
我有一个<my-el>结构与此类似的自定义元素(纯静态的、服务器呈现的 HTML):
<my-el>
<div>a</div>
<div>b</div>
<div>c</div>
<div>d</div>
</my-el>
Run Code Online (Sandbox Code Playgroud)
由于 Chrome 不保证connectedCallback自定义元素的子元素可用性,我使用HTMLParsedElement它基本上使用以下步骤延迟自定义元素初始化:
nextSibling(在这种情况下解析器可能已经通过my-el),或者是否DOMContentLoaded已经到达(又名document.readyState !== 'loading')。MutationObserver就childList重新检查以上条件。概述的策略目前仍然存在的问题是,MutationObserver当这是可用的 HTML 时,可能会被触发:
<my-el>
<div>a</div>
<div>b</div>
</my-el>
Run Code Online (Sandbox Code Playgroud)
甚至这个
<my-el>
<div>a</div>
</my-el>
Run Code Online (Sandbox Code Playgroud)
在这些情况下, MutationObserver 会被多次触发,并且处理程序无法知道</my-el>实际何时到达结束。
问题:有谁知道div像这样包装所有内部元素是否可以解决这个问题:
<my-el>
<div>
<div>a</div>
<div>b</div>
<div>c</div>
<div>d</div>
</div>
</my-el>
Run Code Online (Sandbox Code Playgroud)
或者换句话说,当变异观察者为这个结构触发时,我能否可靠地假设包装子 div 完全可用,包括它的所有后代节点?
javascript dom mutation-observers custom-element native-web-component
我可以在脚本标记中使用自定义属性,例如:
<script type="text/javascript" mycustomattribute="foo">
//javascript
</script>
Run Code Online (Sandbox Code Playgroud)
然后使用包含的javascript访问'mycustomattribute'的值?