2010-02-04 3 views
17

Каков наилучший способ обнаружения Internet Explorer 6 с помощью JavaScript?Каков наилучший способ обнаружения Internet Explorer 6 с помощью JavaScript?

If browser == IE6 { 
    alert('hi'); 
} 
+44

если (everythingIsBroken) IE6 = истина; – womp

+2

@womp должно быть == – Woot4Moo

+7

@ woot4moo ну это IE6, так что неважно, все равно – TIMEX

ответ

31

Условные комментарии являются хорошей альтернативой:

<!--[if IE 6]> 
<script> 
var everythingIsBroken = true; 
</script> 
<![endif]--> 

Edit: Если вы все еще ищете для поддержки IE 6 в 2017 году или после. .. хорошо, мое сердце уходит к вам. Ответ на этот вопрос в 2017 году действительно не стоит беспокоиться об IE 6. Это больше не поддерживаемый браузер. Любая операционная система, которая может запускать этот браузер и сам браузер, больше не получает обновлений безопасности. Это означает, что пользователи, использующие это программное обеспечение, подвергаются большому риску использования. Это большая проблема для людей, которые не могут позволить себе модернизировать.

+0

Это серьезный ответ? – TIMEX

+7

Должно быть.Условные комментарии - это что-то, введенное Microsoft как способ запуска определенного кода в (определенных версиях) IE. Поскольку они находятся в комментариях HTML, другие браузеры будут игнорировать его. – Aistina

+2

Условные комментарии не являются жизнеспособной альтернативой. Хотя они работают в IE напрямую, их можно отключить в другом подобном браузере при использовании элемента управления WebBrowser. В этом случае ваш условный комментарий становится бесполезным. Большинство сторонних браузеров, использующих движок Trident4, отключили условные комментарии. –

6
var ua = window.navigator.userAgent; 
    var msie = ua.indexOf ("MSIE "); 

    if (msie > 0)  // If Internet Explorer, return version number 
    return parseInt (ua.substring (msie+5, ua.indexOf (".", msie))); 
    else     // If another browser, return 0 
    return 0; 

Источник: http://support.microsoft.com/kb/167820

+1

-1: Никогда не используйте пользовательский агент для идентификации браузера. Вместо этого используйте обнаружение на основе функций. –

+0

Почему в чем причина? он отлично работает на IE, FF и хром! –

+0

@ Yassir: Есть много браузеров там, используя тот же движок (Trident 4), что и MSIE 6. Использование обнаружения объектов по сравнению с обнаружением агента пользователя захватывает их. Он также имеет меньше ложных срабатываний, чем обнаружение агента пользователя (у многих браузеров есть возможность изменить свой UA для передачи в качестве другого браузера). –

5

Не основывайте свое обнаружение на пользователе-агенте. Существует множество других браузеров, в которых используется движок Trident 4 (один из IE6), которые не являются IE6.

Ответ прост: не обнаружить браузер, обнаружить двигатель. Для этого вы должны использовать то, что называется функцией обнаружения на основе.


Использование функции обнаружения на основе функции имеет следующие преимущества:

  • обнаруживает все браузеры, используя аналогичный движок рендеринга, чем цель.
  • Более легкое разветвление кода для решения проблем механизма рендеринга.
  • Меньше ложных срабатываний (UA могут быть изменены для передачи в качестве другого браузера, функции не могут).

В следующем сценарии используются функции браузера для обнаружения двигателя. Кредит для производственной команды MooTools (http://mootools.net/developers/).

Примечание: Ниже приведен фрагмент ниже был изменен для использования без рамки javascript MooTools. Если вы хотите работать с MooTools, вам больше не нужен этот код, он является частью дистрибутива.

function $tryCatch(){ 
    for (var i = 0, l = arguments.length; i < l; i++){ 
     try { 
      return arguments[i](); 
     } catch(e){} 
    } 
    return null; 
}; 

var Browser = { 

    Engine: {name: 'unknown', version: 0}, 

    Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()}, 

    Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)}, 

    Plugins: {}, 

    Engines: { 

     presto: function(){ 
      return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); 
     }, 

     trident: function(){ 
      return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4); 
     }, 

     webkit: function(){ 
      return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419); 
     }, 

     gecko: function(){ 
      return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18); 
     } 

    } 

}; 

Browser.Platform[Browser.Platform.name] = true; 

Browser.detect = function(){ 

    for (var engine in this.Engines){ 
     var version = this.Engines[engine](); 
     if (version){ 
      this.Engine = {name: engine, version: version}; 
      this.Engine[engine] = this.Engine[engine + version] = true; 
      break; 
     } 
    } 

    return {name: engine, version: version}; 

}; 

Browser.detect(); 

Browser.Request = function(){ 
    return $tryCatch(function(){ 
     return new XMLHttpRequest(); 
    }, function(){ 
     return new ActiveXObject('MSXML2.XMLHTTP'); 
    }, function(){ 
     return new ActiveXObject('Microsoft.XMLHTTP'); 
    }); 
}; 

Browser.Features.xhr = !!(Browser.Request()); 

Browser.Plugins.Flash = (function(){ 
    var version = ($tryCatch(function(){ 
     return navigator.plugins['Shockwave Flash'].description; 
    }, function(){ 
     return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); 
    }) || '0 r0').match(/\d+/g); 
    return {version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0}; 
})(); 

function $exec(text){ 
    if (!text) return text; 
    if (window.execScript){ 
     window.execScript(text); 
    } else { 
     var script = document.createElement('script'); 
     script.setAttribute('type', 'text/javascript'); 
     script[(Browser.Engine.webkit && Browser.Engine.version < 420) ? 'innerText' : 'text'] = text; 
     document.head.appendChild(script); 
     document.head.removeChild(script); 
    } 
    return text; 
}; 

Просто включите этот класс JavaScript, и вы можете обнаружить IE6 и любой другой браузер, используя двигатель Trident4, выполнив следующие действия:

if(Browser.Engine.trident4) { 
    alert('IE6 or similar...'); 
} elseif(Browser.Engine.name == "trident") { 
    alert('Internet Explorer Trident Rendering Engine Version ' + Browser.Engine.version); 
} 
+2

Это не похоже на обнаружение функции, которое вы рекомендуете в комментариях к другим ответам на этот вопрос. –

+0

@Tim Down: Я сказал функцию ** на основе ** обнаружения, а не обнаружения функции. Функциональное обнаружение попыталось идентифицировать ** двигатель ** на основе функций, реализованных в движке JavaScript этого конкретного механизма рендеринга. Обнаружение функции позволяет включать и отключать функции на основе, если оно было обнаружено как поддерживаемое. Зная механизм, используемый для рендеринга страницы, позволяет исправить причуды с отображением динамических элементов на этой странице. Этот метод также называется обнаружением объектов. –

+4

Это особенность вывода, и flaky. Какие выводы вы хотели бы сделать, основываясь на существовании 'document.getBoxObjectFor' или' window.mozInnerScreenX' или 'navigator.taintEnabled'? Если вы собираетесь использовать их для изменения поведения, не связанного с тестируемыми объектами, это всего лишь небольшой шаг от изучения строки userAgent для меня. Эти объекты могут быть переопределены JavaScript и, как правило, нестандартны и, следовательно, подчиняются прихотям браузеров: MooTools был ужален этим совсем недавно (http://ajaxian.com/archives/mootools-call-to-upgrade). –

1

Что является лучшим способом для обнаружения <browser_x> с использованием JavaScript?

Недостаточно.

Как Эндрю Мур упомянул в комментариях к этому сообщению, вы должны использовать обнаружение функции. Это сделает ваш код более «надежным».Если другой браузер включает или больше не поддерживает функцию в будущем, тогда ваш код будет в безопасности. Есть несколько сайтов, объясняющих, как с этим справиться. Концепция огромна и охватывает много понятий, так что вместо того, чтобы писать эссе/книги по этому вопросу, вот некоторые ресурсы для использования:

+0

Предположим, что в конкретной версии браузера вы хотите работать с ошибкой рендеринга, но вы хотите использовать ее только для браузера и версии (например, предположим, что прозрачные фоны отображаются неправильно на кнопках или что-то в этом роде). В этом сценарии нет такой функции, как обнаружение функции - вы не можете «обнаруживать» ошибку рендеринга. В реальном мире не всякая причуда в браузере может быть обнаружена с помощью функции, и вы не можете просто предположить, что люди, спрашивающие об обнаружении браузера, менее осведомлены, чем вы, или не имеют веских оснований для этого. – thomasrutter

+0

@thomasrutter Не все ошибки отображения невозможно обнаружить. Но, в общем, ошибки ошибок - это проблема CSS, у которой есть свой собственный набор стратегий, которые отделены от JavaScript-браузера. Этот вопрос специально задавал вопрос о * JavaScript *, который * почти * никогда не нуждается в обнаружении браузера, если он написан правильно. Обвиняемый не был настроен по поводу необходимости поиска браузера, и уже существует достаточно стратегий обнаружения IE6, упомянутых здесь. Я представил альтернативу, о которой, возможно, не знал об этом, может быть лучше в 90% случаев. –

+0

Цвет меня впечатлил, что вы вернулись, чтобы ответить на новый комментарий к сообщению, которое вы сделали более 2 лет назад :) – thomasrutter

0

Я не уверен, есть ли какая-то особая причина, по которой вы хотите обнаружить IE 6, но в целом лучше попытаться обнаружить функции браузера, а не обнаруживать браузер. Вы можете сделать это легко с помощью JQuery, используя jQuery.support: http://api.jquery.com/jQuery.support/.

+2

Это действительно хорошая рекомендация рекомендовать кому-то использовать массивную библиотеку JavaScript или фреймворк для простой проблемы, которая не требует ничего вид решения? –

+0

Я бы не назвал jQuery «массивным». То, что плакат задает, как это сделать, - это то, что в значительной степени не должно быть сделано, поэтому более ценный совет - вот почему и что он/она должен делать вместо этого, чтобы он/она следовал хорошей практике программирования. – jhchen

26

Рискуя на самом деле ответить на вопрос, который был задан (и предполагая, на мгновение спрашивающий имеет хорошую причину специфически обнаружения IE6):

if (/\bMSIE 6/.test(navigator.userAgent) && !window.opera) { 
    // yep, browser claims to be IE6 
} 
+9

+1 Спасибо за то, что ответили на этот вопрос и не рассказывали о том, почему нужно использовать функцию обнаружения, в некоторых случаях обнаружение браузера по-прежнему полностью действует. – Lightweight

+3

Функция обнаружения предпочтительнее, когда обнаружение функции на самом деле является тем, что вы хотите сделать (что, вероятно, есть в * большинстве случаев, когда люди спрашивают о обнаружении браузера). Однако, когда вам нужно применить работу для ошибки в определенной версии браузера, функция обнаружения часто не возможна (например, может быть, это ошибка рендеринга, поэтому она не может быть «обнаружена»). Если вы используете обнаружение браузера на основе пользовательского агента, вам нужно убедиться, что регулярное выражение предназначено только для конкретной ошибки, а не для будущих версий, - или ваш код сломается, когда будущие версии браузера «исправить» ошибку. – thomasrutter

+0

Моей причиной для поиска этой информации является обнаружение IE6 в файле HTC, который уже дефактонизирован как Internet Explorer, но IE6 и IE8, 9, 10, 11, 12. Не требуйте тех же решений для исправления CSS. Ваш ответ на вопрос также отвечает на мой вопрос. Я хотел бы быть в мире, где браузеры IE работали над стандартами, но я не знаю, и если эти страницы с дефектами не отображают, то они не представляют собой бренды, с которыми я работаю. Для хорошего или плохого (в основном плохо), мне нужно иметь дело с IE. – Wayne

2

Очень поздно дополнение.

В дополнении к условным комментариям HTML, используемых в apphacker's answer, JScript реализации Microsoft также предоставляет conditional comments for JavaScript:

<script type="text/javascript"> 
    var isIE6 = /*@cc_on/*@if(@_jscript_version<=5.6)[email protected]@*/0/*@[email protected]*/; 

    if (isIE6) { 
     alert("You're screwed"); 
    } 
</script> 

Хорошей вещи в том, что он также может быть использован во внешних файлах JavaScript (.js).

За таблицей версии JScript, которые реализуются с помощью хост-приложения Microsoft: JavaScript Version Information

+0

Это не технически условные комментарии: это называется условной компиляцией и является отдельным механизмом. Также невозможно использовать его для точного определения версии IE, которая запущена, поскольку JScript может быть обновлен независимо от браузера. –

3

Самый надежный способ сделать это состоит в использовании условных комментариев, как было упомянуто @apphacker. Тем не менее, то, что, казалось бы, менее хорошо известно, что условные комментарии могут быть использованы в JavaScript:

var div = document.createElement("div"); 
div.innerHTML = "<!--[if IE 6]><i></i><![endif]-->"; 
var isIe6 = (div.getElementsByTagName("i").length == 1); 

alert("Is IE 6: " + isIe6); 
0
<!--[if (IE 6)|(IE 7)]> 
<script> 
    alert("Lesser browser detected!"); 
</script> 
<![endif]--> 
Смежные вопросы