Правильный способ использования Modernizr для обнаружения IE?
Это может быть глупый вопрос, но я хотел использовать библиотеку Modernizr JS для обнаружения некоторых свойств браузера, чтобы определить, какой контент показывать или не показывать.
У меня есть приложение под названием Pano2VR, которое выводит как HTML5, так и SWF. Мне нужен HTML5 для пользователей устройств iOS.
Однако IE не выводит этот вывод "HTML5" вообще. Кажется, их вывод использует 3D3-преобразования CSS3 и WebGL, один или несколько явно не поддерживаемых в IE9.
Итак, для этих пользователей мне нужно отобразить версию Flash. Я планировал использовать IFRAME и либо пропускал SRC через Modernizr script, либо document.write из кода IFRAME, в зависимости от браузера.
Все это приводит к тому, как я могу использовать Modernizr для обнаружения IE или IE? Или определить для 3D-преобразования CSS?
Или есть ли другой способ сделать это?
Ответы
Ответ 1
Modernizr не обнаруживает браузеры как таковые, он обнаруживает, какая функция и возможности присутствуют, и это весь смысл того, что он пытается сделать.
Вы можете попробовать подключиться к простому обнаружению script, как это, а затем использовать его, чтобы сделать свой выбор. Я включил версию Detection, а также в случае необходимости. Если вы хотите только проверить версию IE, вы можете просто найти навигатор .userAgent со значением "MSIE".
var BrowserDetect = {
init: function () {
this.browser = this.searchString(this.dataBrowser) || "Other";
this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "Unknown";
},
searchString: function (data) {
for (var i = 0; i < data.length; i++) {
var dataString = data[i].string;
this.versionSearchString = data[i].subString;
if (dataString.indexOf(data[i].subString) !== -1) {
return data[i].identity;
}
}
},
searchVersion: function (dataString) {
var index = dataString.indexOf(this.versionSearchString);
if (index === -1) {
return;
}
var rv = dataString.indexOf("rv:");
if (this.versionSearchString === "Trident" && rv !== -1) {
return parseFloat(dataString.substring(rv + 3));
} else {
return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
}
},
dataBrowser: [
{string: navigator.userAgent, subString: "Edge", identity: "MS Edge"},
{string: navigator.userAgent, subString: "MSIE", identity: "Explorer"},
{string: navigator.userAgent, subString: "Trident", identity: "Explorer"},
{string: navigator.userAgent, subString: "Firefox", identity: "Firefox"},
{string: navigator.userAgent, subString: "Opera", identity: "Opera"},
{string: navigator.userAgent, subString: "OPR", identity: "Opera"},
{string: navigator.userAgent, subString: "Chrome", identity: "Chrome"},
{string: navigator.userAgent, subString: "Safari", identity: "Safari"}
]
};
BrowserDetect.init();
document.write("You are using <b>" + BrowserDetect.browser + "</b> with version <b>" + BrowserDetect.version + "</b>");
Ответ 2
Вы можете использовать Modernizr для обнаружения просто IE или не IE, путем проверки поддержки SVG SMIL.
Если вы включили обнаружение функции SMIL в настройке Modernizr, вы можете использовать простой подход CSS и настроить класс .no-smil, который применяется в Modernizr элемент html:
html.no-smil {
/* IE/Edge specific styles go here - hide HTML5 content and show Flash content */
}
В качестве альтернативы вы можете использовать Modernizr с помощью простого JavaScript-подхода, например:
if ( Modernizr.smil ) {
/* set HTML5 content */
} else {
/* set IE/Edge/Flash content */
}
Помните, что IE/Edge может когда-нибудь поддерживать SMIL, но в настоящее время нет планов сделать это.
Для справки, здесь ссылка на таблицу совместимости SMIL на caniuse.com.
Ответ 3
Обнаружение 3D-преобразований CSS
Modernizr может обнаруживать 3D-преобразования CSS, да. Правка Modernizr.csstransforms3d
сообщит вам, поддерживает ли браузер их.
Вышеупомянутая ссылка позволяет вам выбрать, какие тесты включать в сборку Modernizr, и там, где вы ищете, есть.
Обнаружение IE специально
В качестве альтернативы, как и user356990, вы можете использовать условные комментарии, если вы ищете только IE и IE. Вместо создания глобальной переменной вы можете использовать HTML5 Boilerplate <html>
условный комментарий для назначения класса:
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
Если вы уже инициализировали jQuery, вы можете просто проверить с помощью $('html').hasClass('lt-ie9')
. Если вам нужно проверить версию IE, в которой вы находитесь, вы можете условно загрузить jQuery 1.x или 2.x, вы можете сделать что-то вроде этого:
myChecks.ltIE9 = (function(){
var htmlElemClasses = document.querySelector('html').className.split(' ');
if (!htmlElemClasses){return false;}
for (var i = 0; i < htmlElemClasses.length; i += 1 ){
var klass = htmlElemClasses[i];
if (klass === 'lt-ie9'){
return true;
}
}
return false;
}());
N.B. IE условные комментарии поддерживаются только до IE9 включительно. Начиная с IE10, Microsoft поощряет использование обнаружения функций, а не обнаружения браузера.
Какой бы метод вы ни выбрали, вы затем проверите с помощью
if ( myChecks.ltIE9 || Modernizr.csstransforms3d ){
// iframe or flash fallback
}
Не принимайте это ||
буквально, конечно.
Ответ 4
Если вы ищете версию JS (используя комбинацию обнаружения функций и нюхания UA) того, что использовали html5:
var IE = (!! window.ActiveXObject && +(/msie\s(\d+)/i.exec(navigator.userAgent)[1])) || NaN;
if (IE < 9) {
document.documentElement.className += ' lt-ie9' + ' ie' + IE;
}
Ответ 5
CSS-трюки имеют хорошее решение для IE 11:
http://css-tricks.com/ie-10-specific-styles/
.NET и Trident/7.0 уникальны для IE, поэтому их можно использовать для обнаружения IE версии 11.
Затем код добавляет строку User Agent в тег html с атрибутом 'data-useragent', поэтому IE 11 может быть специально настроен...
Ответ 6
Вы можете использовать < !-- [if IE] >
взломать глобальную переменную js, которая затем тестируется в вашем обычном js-коде. Немного уродливый, но сработал хорошо для меня.
Ответ 7
Мне нужно было обнаружить IE против большинства остальных, и я не хотел зависеть от строки UA. Я обнаружил, что использование es6number
с Modernizr сделало именно то, что я хотел. Я не очень беспокоюсь об этом изменении, так как я не ожидаю, что IE когда-либо будет поддерживать ES6 Number. Итак, теперь я знаю разницу между любой версией IE vs Edge/Chrome/Firefox/Opera/Safari.
Подробнее здесь: http://caniuse.com/#feat=es6-number
Обратите внимание, что меня не очень беспокоят ложные негативы Opera Mini. Вы можете быть.
Ответ 8
Что ж, после дальнейших исследований по этой теме я использовал следующее решение для таргетинга IE 10+. Поскольку IE10 и 11 являются единственными браузерами, которые поддерживают высококонтрастный медиа-запрос -ms, это хороший вариант без JS:
@media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {
/* IE10+ specific styles go here */
}
Работает отлично.