问题 IE11是否删除了javascript条件编译?


我一直在使用确定IE Trident引擎的版本 javascript条件编译

var ieVersion = undefined;
/*@cc_on
   ieVersion = Math.floor(@_jscript_version);
@*/

这适用于IE8,9和10.在IE11中,条件评论的块不执行, 除非 我使用F12开发工具来模拟IE10(在这种情况下,它返回正确的值,11)。

这是令人困惑的,因为 关于条件编译的MSDN页面  指定它适用于Internet Explorer 11。 (更新2015-02-03:此页面已更新,以明确说明其内容 才不是 在标准模式下适用于IE11。)我 没有在网上找到任何信息 建议IE11不应该支持条件评论。

有没有人有这方面的信息?任何人都可以在IE11中重现这种行为吗?


编辑:这与IE的相关性 <audio> 支持。我有一个网络应用程序需要播放约50个短(~1秒)音频文件,这些文件应以(伪)随机顺序播放,并在用户交互后单独播放。问题是多种多样的:

  • IE9的无证限制为41 audio 元素(无论是在HTML中声明还是在JS对象中声明)。所有后续音频文件都无法加载和播放。 (41个元素中的每一个都可以重新分配它的源,但是每一次重新分配也会无声地失败。我很想看到这些错误背后的代码......)
  • 播放短音时IE10和IE11“口吃”:它们只播放一秒钟,然后暂停,然后继续播放。对最终用户的影响是音频难以理解。 (该 audiopreload="auto" 并报告非零缓冲区。)

当然,没有实用的方法来检测这些问题,因此浏览器检测。我一般认为用户代理嗅探对于生产代码来说过于冒险;该 @cc_on 技术似乎更强大。

我对IE9的解决方法是将应用程序状态序列化为 sessionStorage 在第25个声音之后,然后重新加载页面并反序列化。

在IE10 / 11中,我的解决方法是以0音量播放最后90%的音频,这似乎迫使IE使用 其实 缓冲文件。


12701
2017-12-05 05:27


起源

IE11删除了对条件编译的支持。 - Qantas 94 Heavy
@ Qantas94Heavy你可以提供一个来源吗?正如我在问题中所说,MSDN告诉我 明确地 IE11支持条件编译。因此,混乱。 - Jeremy
@ Qantas94Heavy有条件的编译!==有条件的评论。 - Teemu
奇怪的是,官方MS文档明确指出,每个版本的IE都可以使用条件编译。虽然我甚至无法让他们的例子在IE11中工作......无论如何, ScriptEngineMajorVersion() 给你相同的结果 @_jscript_version,不需要条件编译。此功能也在IE11中运行。 - Teemu
只是一个随机的想法,但也许你可以将所有文件连接成一个 <audio> 元素,然后使用,例如, currentTime由此产生的财产 HTMLMediaElement 确定从何处开始和停止播放。 - Stephen Thomas


答案:


是的,IE11删除了javascript条件编译


谷歌搜索 在上面链接的两个MSDN页面之后,问题中链接将此问题作为第三个结果返回。这确定了缺乏更好的来源,所以我认为这个问题(包括评论)应该被认为是在IE11中没有Javascript条件编译这一事实的权威参考。

我已经在MSDN页面上提交了反馈,说明它们不正确。

更新2015-02-03MSDN 现在承认IE11不再支持 @cc_on


一些解决方法如下:

用户代理检测

 /\([^)]*Trident[^)]*rv:([0-9.]+)/.exec(ua)

将解析IE11的UA字符串并在结尾返回“修订号”。

ScriptEngineMajorVersion() (感谢@Teemu)

 var tridentVersion = 
     typeof ScriptEngineMajorVersion === "function" ?
         ScriptEngineMajorVersion() : undefined

应该在所有浏览器上正确评估,但我们无法保证 ScriptEngineMajorVersion 不会在没有警告的情况下删除,就像条件编译一样。


感谢所有评论者。


12
2017-12-09 05:24