Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

关于currentScript的兼容问题

  Chrome和Firefox上都提供了document.currentScript,用来获取当前正在执行的SCRIPT元素(注意不是当前执行的代码所在的SCRIPT元素)。如果代码被注册到一个计时器事件中执行,它就无法获取到,因为处理计时器事件时SCRIPT元素中的代码已经执行完毕了。
  计时器事件毕竟的属于DOM的东西,如果换成JavaScript自身的异步的话就不一定了。比如下面代码:

  其实我觉得这个结果是Firefox的BUG,Chrome才是正确的。Firefox将Promise异步注册到了DOM消息中,导致Promise在SCRIPT执行完后才开始执行。而Chrome则将其作为当前JavaScript消息的一部分。
  嘛,这部分现在规范还没成熟,暂时不纠结。其实这篇文章主要是纠结IE的问题。到目前为止(IE11),所有版本的IE都依然不支持currentScript。但如果了解了它的行为,确实可以在一定程度上模拟。
  DOM消息是同步的(我已经不想吐Web单线程的梗了),所以在同一个时间只会有一个SCRIPT元素的代码被执行。所以,我们只要遍历中的SCRIPT元素,找出当前正在执行的那个,它就是currentScript。那么,如何判断SCRIPT元素正在执行呢?实际上IE10及之前的IE版本都可以直接通过SCRIPT元素的readyState属性来判断。当其值为"interactive"时,表示这个SCRIPT元素的代码正在被执行。于是可以写一个IE8~IE10兼容的polyfill。
<script>
Object.defineProperty(document,"currentScript",{
  get:function(){
    var s=document.getElementsByTagName("script"),i=0,e;
    while(e=s[i++])if(e.readyState=="interactive")return e;
    return null;
  }
});
console.log(document.currentScript);
</script>

  更低版本的IE不支持给对象添加访问器属性,但可以定义成一个函数来调用,这里就不演示了。
  最后还有个IE11的问题没解决,IE11不知道是哪根筋抽了,不把currentScript兼容上也就算了,还把SCRIPT元素的readyState属性给删掉了。所以对于IE11我暂时也没办法解决,如果有谁找到IE11上的兼容办法的话跪求分享啊!
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^