我一直在使用javascript条件编译确定IE Trident引擎的版本:
var ieVersion = undefined; /*@cc_on ieVersion = Math.floor(@_jscript_version); @*/
这适用于IE8,9和10.在IE11中,条件评论的块不执行,除非我使用F12开发工具模拟IE10(在这种情况下它返回正确的值,11).
这很令人困惑,因为条件编译上 的MSDN页面指定它适用于Internet Explorer 11.(更新2015年2月3日:此页面进行了更新,明确规定其含量不.适用于IE11的标准模式),我没有发现任何信息网上表明IE11不应该支持有条件的意见.
有没有人有这方面的信息?任何人都可以在IE11中重现这种行为吗?
编辑:这与IE的支持相关.我有一个网络应用程序需要播放大约50个短(~1秒)的音频文件,这些文件应该以(伪)随机顺序播放,并在用户交互后单独播放.问题是多种多样的:
IE9的未记录限制为41个audio
元素(无论是在HTML中声明还是在JS对象中声明).所有后续音频文件都无法加载和播放.(41个元素中的每一个都可以重新分配它的源,但是每一次重新分配也都会无声地失败.我很想看到这些错误背后的代码......)
播放短音时IE10和IE11"口吃":它们只播放一小段时间,然后暂停,然后继续播放.对最终用户的影响是音频难以理解.(audio
s有preload="auto"
并报告非零缓冲区.)
当然,没有实用的方法来检测这些问题,因此浏览器检测.我一般认为用户代理嗅探对于生产代码来说过于冒险; 这项@cc_on
技术似乎更加强大.
我对IE9的解决方法是将应用程序状态sessionStorage
序列化为第25个声音,然后重新加载页面并反序列化.
在IE10/11中,我的解决方法是以0音量播放最后90%的音频,这似乎迫使IE 实际缓冲文件.
在上面链接的两个MSDN页面之后,问题中链接的谷歌搜索将此问题作为第三个结果返回.这确定了缺乏更好的来源,所以我认为这个问题(包括评论)应该被认为是在IE11中没有Javascript条件编译这一事实的权威参考.
我已经在MSDN页面上提交了反馈,说明它们不正确.
更新2015-02-03:MSDN现在承认IE11不再支持@cc_on
.
一些解决方法如下:
用户代理检测
/\([^)]*Trident[^)]*rv:([0-9.]+)/.exec(ua)
将解析IE11的UA字符串并在结尾返回"修订号".
ScriptEngineMajorVersion()(感谢@Teemu)
var tridentVersion = typeof ScriptEngineMajorVersion === "function" ? ScriptEngineMajorVersion() : undefined
应该在所有浏览器上正确评估,但我们不能保证ScriptEngineMajorVersion
不会在没有警告的情况下删除,就像条件编译一样.
感谢所有评论者.