/*@cc_on и обнаружение IE6

Исследуя условные комментарии JavaScript для IE, я наткнулся на @cc_on. Кажется, это работает. Однако запись в Википедии для условных комментариев содержит следующий код для более надежного обнаружения IE, в частности IE6. :

/*@cc_on
    @if (@_jscript_version > 5.7)
    document.write("You are using IE8+");

    @elif (@_jscript_version == 5.7 && window.XMLHttpRequest)
    document.write("You are using IE7");

    @elif (@_jscript_version == 5.6 || (@_jscript_version == 5.7 && !window.XMLHttpRequest))
    document.write("You are using IE6");

    @elif (@_jscript_version == 5.5)
    document.write("You are using IE5.5");

    @else
    document.write("You are using IE5 or older");

@end

@*/

Проблема в том, что я получаю ошибку javascript "ожидаемая константа" на !window.XMLHttpRequest.

Очевидно, Википедии нужна помощь, и мне нужно, чтобы это заработало. Может кто-нибудь мне помочь?


comment
Более надежное обнаружение IE? Я думаю, что условные комментарии обеспечивают наиболее надежную форму обнаружения IE. Не полагайтесь на версию JScript для определения версии IE, так как они независимы. См. пункт 4 webreflection.blogspot.com/2009/01/ Более того, вообще не следует использовать определение браузера; использовать обнаружение функций: nczonline.net /блог/2009/12/29/   -  person Marcel Korpel    schedule 01.03.2010
comment
Обнаружение @_jscript_version следует использовать только в том случае, если вы знаете точную разницу между версиями движка jscript и хотите как-то ориентироваться на эту разницу — например, эмулировать отсутствующую функцию. Например, в jscript 5.1 не было определено ни методов вызова/применения прототипа функции, ни Array.prototype.push. Таким образом, можно безопасно обнаружить эту @_jscript_version и добавить программную поддержку этих функций. Однако, как сказал Марсель, небезопасно предполагать, что @_jscript_version 5.1 сопоставляется с IE5.01, поскольку вы можете легко обновить jscript из Центра обновления Windows.   -  person Vitaly Sharovatov    schedule 18.03.2010
comment
@Vitaly: Я не хочу слишком много придираться, но примеры, которые вы привели, можно протестировать с обнаружением функций, поэтому вам также не нужно тестировать версию Javascript ›= 1.3 или что-то в этом роде. Просто используйте if (!Function.prototype.call) { Function.prototype.call = foo; } и т. д., как это делает Oz.js: code.google.com/p/oz-js/source/browse/trunk/oz.js#224   -  person Marcel Korpel    schedule 18.03.2010
comment
Я понимаю, что это сильно устарело, но я наткнулся на это, когда мне нужно было выполнить обнаружение старого браузера. Просто для справки: в вызове выше вы должны использовать оператор typeof, чтобы избежать ошибки, которую вы получаете. Это не то, как я бы специально тестировал для IE6, но, как я сказал, просто для справки, ваш код должен быть.. if (typeof window.XMLHttpRequest=="undefined") { /* code here */ }   -  person Ric    schedule 18.06.2014


Ответы (4)


Определенно не эксперт JS, но некоторые поиски нашли это для изоляции IE6 от IE7 с использованием jscript_version == 5.7:

/*@cc_on
if (@_jscript_version==5.6 ||
   (@_jscript_version==5.7 &&
      navigator.userAgent.toLowerCase().indexOf("msie 6.") != -1)) {
  //ie6 code
}
@*/

Может быть, это укажет вам правильное направление.

Источник: http://sharovatov.wordpress.com/2009/06/03/efficient-ie-version-targeting/

person JBickford    schedule 04.12.2009
comment
Я хотел бы немного пояснить, но вы во многом правы. Проблема оказалась в попытке вызвать обычный JavaScript в предварительно скомпилированных операторах условного комментария @elif и т. д. Когда вы просто предварительно компилируете версию jscript и запускаете все остальное как традиционный JavaScript, все компилируется и работает нормально. - person Jack; 04.12.2009
comment
@Marcel Korpel - вы читали мой пост в блоге, на который ссылается JBickford? Проверка userAgent используется внутри блока условной компиляции (поэтому применяется только к IE), и нет другого способа определить разницу между IE7, который имеет jscript 5.7, и IE6 в Windows XP SP3, который также имеет jscript 5.7. - person Vitaly Sharovatov; 16.03.2010
comment
@Vitaly: Должен признаться, я не читал вашу статью, и я был немного резок в своем первоначальном комментарии, за что прошу прощения (и я удалил комментарий). У вас есть точка зрения, что вы можете безопасно определить версию IE в блоке условной компиляции (и этого будет достаточно, также проверка версии JScript не нужна), а определение браузера нужно для проверки :hover возможности (насколько я знаю, их нельзя обнаружить), но я думаю, что использование условных комментариев — более удобный способ сделать это. Тем не менее, в большинстве случаев вы можете и должны просто использовать обнаружение признаков. - person Marcel Korpel; 18.03.2010
comment
@Marcel Простой проверки строки navigator.userAgent в блоке условной компиляции явно недостаточно, поскольку IE6 может иметь как jscript версии 5.6, так и 5.7 (при установке XPSP3). Поэтому вам нужно объединить обе проверки - для @_jscript_version И navigator.userAgent, если @_jscript_version возвращает 5.7. И нет никакого способа отличить IE6 с jscript 5.6 или 5.7 от условных комментариев - [если IE 6] будет проанализирован обоими. Обнаружение функций может помочь в большинстве случаев, но в некоторых случаях с наиболее неясными ошибками вам просто нужно знать точную версию jscript и trident. - person Vitaly Sharovatov; 18.03.2010
comment
@Vitaly: я согласен с вами, что вам нужно искать версию JScript, если вам нужны определенные функции или вы хотите устранить ошибку, связанную с JScript. Однако первоначальный вопрос касался обнаружения IE 6. - person Marcel Korpel; 18.03.2010

Я нашел решение. Код выглядит следующим образом.

<script type="text/javascript" charset="utf-8">
/*@cc_on
if (@_jscript_version > 5.7)
 document.write("You are using IE8");
else if (@_jscript_version == 5.7 && window.XMLHttpRequest)
 document.write("You are using IE7");
else if (@_jscript_version == 5.6 || (@_jscript_version == 5.7 && !window.XMLHttpRequest))
 document.write("You are using IE6");
else if (@_jscript_version == 5.5)
 document.write("You are using IE5.5");
else
 document.write("You are using IE5 or older");
@*/
</script>
person Just a learner    schedule 28.01.2010
comment
Вы слепой? Это тот же фрагмент кода, который он включил в свой вопрос. - person Josh Stodola; 28.01.2010
comment
Привет, Джош, я изменил @if...@elif...@else...@end на if...else if...else. Я обнаружил, что некоторый код в @if...@elif...@else...@end не будет выполняться должным образом, например часть window.XMLHttpRequest. Но это хорошо работает в обычных операторах if. - person Just a learner; 29.01.2010

Я использую этот хороший однострочник в течение многих лет:

var IE; //@cc_on IE = parseFloat((/MSIE[\s]*([\d\.]+)/).exec(navigator.appVersion)[1]);

Маленький и точный (проверено в IE 6-10).

Примечание для тех, кто использует grunt. не забудьте установить saveComments: 'some', если вы используете плагин uglify, чтобы убедиться, что условные комментарии не удаляются.

person will Farrell    schedule 02.04.2013
comment
Где вы нашли эту милую строчку? - person yckart; 19.06.2013
comment
@yckart Я написал это. Вы можете увидеть мою последнюю версию на github.com/willfarrell /angular-io/blob/master/src/scripts/ie.js, который включает проверку chromeframe (которая станет ненужной с января 2014 года, так как хромовая известность больше не поддерживается). - person will Farrell; 27.06.2013

может быть, немного опоздал на вечеринку, но я также столкнулся с этой проблемой, получил удовольствие от нее, и мое решение было следующим, надеюсь, что это поможет https://github.com/davesmiths/isIE

var isIE = false;
/*@cc_on isIE = @_jscript_version;@*/
if (isIE !== false) {
   if (isIE == 5.8)
       isIE = 8;
   else if (isIE == 5.7 && window.XMLHttpRequest)
       isIE = 7;
   else if (isIE == 5.7 || isIE == 5.6)
       isIE = 6;
   else if (isIE <= 5.5)
       isIE = 5;
} 
person davesmiths    schedule 13.12.2013