Удалил ли 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. ( UPDATE 2015- 02-03: эта страница с тех пор была обновлена, чтобы явно указать, что ее содержимое не относится к IE11 в стандартном режиме.) Я not нашел любую информацию в Интернете, чтобы предположить, что IE11 не должен поддерживать условные комментарии.
Есть ли у кого-нибудь информация об этом? Может ли кто-нибудь воспроизвести это поведение в IE11?
Изменить: релевантность этого в поддержке IE <audio>
. У меня есть веб-приложение, которое требует воспроизведения около 50 коротких (~ 1сек) аудиофайлов, которые должны воспроизводиться в (псевдо) случайном порядке и индивидуально после взаимодействия с пользователем. Проблемы различны:
- IE9 имеет недокументированный предел из 41
audio
элементов (объявленных в HTML или как объекты JS). Все последующие звуковые файлы молча загружаются и воспроизводятся. (Каждый из 41 элементов может перенаправить свой источник, но каждое второе повторное назначение также терпит неудачу. Мне бы хотелось увидеть код, лежащий в основе этих ошибок...)
- IE10 и IE11 "заикаются" при воспроизведении коротких звуков: они играют небольшую долю секунды, затем останавливаются, а затем продолжаются. Эффект для конечного пользователя заключается в том, что звук непонятен. (
audio
имеют preload="auto"
и сообщают ненулевой буфер.)
Естественно, нет никакого практического способа распознавания этих проблем, следовательно, обнаружения браузера. Я вообще чувствую, что пользовательский агент нюхает слишком рискованно для производственного кода; метод @cc_on
казался более надежным.
Моим обходным решением для IE9 является сериализация состояния приложения до sessionStorage
после 25-го звука, затем перезагрузите страницу и десериализуйте.
В IE10/11 мое обходное решение состоит в том, чтобы воспроизвести последние 90% аудио в 0 томах, что, похоже, заставляет IE фактически буферизовать файл.
Ответы
Ответ 1
Да, IE11 удалил условную компиляцию javascript
google search, связанный в вопросе, возвращает этот вопрос в качестве третьего результата после двух страниц MSDN, также связанных выше. Это указывает на отсутствие лучшего источника, поэтому я считаю, что этот вопрос (включая комментарии) следует считать авторитетной ссылкой на то, что условная компиляция Javascript недоступна в IE11.
Я отправил отзыв на страницы 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
не будет исключен без предупреждения, как это было в условной компиляции.
Спасибо всем комментаторам.