如何获取当前脚本元素:
1.使用 document.currentScript
document.currentScript
将返回<script>
当前正在处理其脚本的元素。
<script>
var me = document.currentScript;
</script>
好处
- 简单明了。可靠。
- 不需要修改脚本标签
- 适用于异步脚本(
defer
&async
)
- 与动态插入的脚本一起使用
问题
- 在较旧的浏览器和IE中将无法使用。
- 不适用于模块
<script type="module">
2.按编号选择脚本
为脚本提供id属性可以让您轻松地通过使用id通过id选择它document.getElementById()
。
<script id="myscript">
var me = document.getElementById('myscript');
</script>
好处
- 简单明了。可靠。
- 几乎得到普遍支持
- 适用于异步脚本(
defer
&async
)
- 与动态插入的脚本一起使用
问题
- 需要向脚本标签添加自定义属性
id
属性在某些情况下可能会导致某些浏览器中脚本的怪异行为
3.使用data-*
属性选择脚本
给脚本一个data-*
属性可以让您轻松地从中选择它。
<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>
与以前的选项相比,这没有什么好处。
好处
- 简单明了。
- 适用于异步脚本(
defer
&async
)
- 与动态插入的脚本一起使用
问题
- 需要向脚本标签添加自定义属性
- HTML5,
querySelector()
并非所有浏览器都兼容
- 与使用
id
属性相比,受支持的范围较广
- 会得到解决
<script>
与id
边缘情况。
- 如果另一个元素在页面上具有相同的数据属性和值,则可能会感到困惑。
4.通过src选择脚本
您可以使用选择器按来源选择脚本,而不是使用数据属性:
<script src="//example.com/embed.js"></script>
在embed.js中:
var me = document.querySelector('script[src="//example.com/embed.js"]');
好处
- 可靠
- 适用于异步脚本(
defer
&async
)
- 与动态插入的脚本一起使用
- 无需自定义属性或ID
问题
- 难道不是对本地脚本工作
- 将在不同的环境中引起问题,例如开发和生产
- 静态和脆弱。更改脚本文件的位置将需要修改脚本
- 与使用
id
属性相比,受支持的范围较广
- 如果您两次加载相同的脚本,将导致问题
5.遍历所有脚本以查找所需的脚本
我们还可以遍历每个脚本元素,并逐个检查每个脚本元素以选择所需的元素:
<script>
var me = null;
var scripts = document.getElementsByTagName("script")
for (var i = 0; i < scripts.length; ++i) {
if( isMe(scripts[i])){
me = scripts[i];
}
}
</script>
这样一来,我们便可以在较旧的浏览器中使用先前的两种技术,而这些浏览器对querySelector()
属性的支持不佳。例如:
function isMe(scriptElem){
return scriptElem.getAttribute('src') === "//example.com/embed.js";
}
这继承了采用任何方法的好处和问题,但并不依赖于此,querySelector()
因此在较旧的浏览器中也可以使用。
6.获取最后执行的脚本
由于脚本是按顺序执行的,因此最后一个脚本元素通常是当前正在运行的脚本:
<script>
var scripts = document.getElementsByTagName( 'script' );
var me = scripts[ scripts.length - 1 ];
</script>
好处
问题
- 难道不是异步脚本工作(
defer
&async
)
- 难道不是与动态插入脚本工作