使用Modernizr检测IE的正确方法?

这可能是一个愚蠢的问题,但我想使用Modernizr JS库来检测一些浏览器属性,以确定显示或不显示的内容。

我有一个名为Pano2VR的应用程序,它输出HTML5和SWF。 我需要iOS设备用户的HTML5。

但是,IE并没有呈现这个“HTML5”输出。 看起来他们的输出使用CSS3 3D变换和WebGL,一个或多个显然不支持IE9。

所以,对于那些用户我需要显示Flash版本。 我打算使用IFRAME,并通过Modernizr脚本或文档传递SRC。根据浏览器写出正确的IFRAME代码。

所有这些导致我如何使用Modernizr来检测简单的IE浏览器或不IE浏览器? 或检测到CSS 3d变换?

还是有另一种方法来做到这一点?

Modernizr没有检测到浏览器,它检测到哪些function和能力存在,这是它试图做的整个jist。

你可以试试像这样简单的检测脚本,然后用它来做出select。 我已经包含了版本检测,以防万一需要。 如果您只想检查任何版本的IE,只需查找具有“MSIE”值的navigator.userAgent即可。

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>"); 

通过检查SVG SMILanimation支持,您可以使用Modernizr来简单地检测IE或不IE。

如果在Modernizr设置中包含SMIL特性检测,则可以使用简单的CSS方法,并将Modernizr应用于。html元素的.no-smil类作为目标:

 html.no-smil { /* IE/Edge specific styles go here - hide HTML5 content and show Flash content */ } 

或者,你也可以用一个简单的JavaScript方法来使用Modernizr,如下所示:

 if ( Modernizr.smil ) { /* set HTML5 content */ } else { /* set IE/Edge/Flash content */ } 

请记住,IE / Edge可能有一天会支持SMIL ,但是目前还没有计划。

作为参考,这里是caniuse.com上的SMIL兼容性图表的链接 。

检测CSS 3D变换

Modernizr 可以检测CSS 3D转换 ,是的。 Modernizr.csstransforms3d的真实性会告诉你浏览器是否支持它们。

通过上面的链接,您可以select在Modernizr版本中包含哪些testing,并且您正在查找的选项在那里可用。


具体检测IE

或者 ,正如user356990回答,如果您单独searchIE和IE,则可以使用条件注释。 您可以使用HTML5 Boilerplate的<html>条件注释技巧来分配一个类,而不是创build一个全局variables:

 <!--[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; }()); 

NB IE条件注释只支持IE9以上。 从IE10开始,微软鼓励使用function检测而不是浏览器检测。


无论您select哪种方法,您都可以使用

 if ( myChecks.ltIE9 || Modernizr.csstransforms3d ){ // iframe or flash fallback } 

不要接受|| 字面上,当然。

如果您正在寻找一个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; } 

你可以使用< !-- [if IE] > hack来设置一个全局的jsvariables,然后在你的正常的js代码中进行testing。 有点丑,但对我来说效果不错。

CSS技巧有一个很好的解决scheme,目标IE 11:

http://css-tricks.com/ie-10-specific-styles/

.NET和Trident / 7.0对于IE来说是唯一的,因此可以用来检测IE版本11。

然后代码将用户代理string添加到具有“data-useragent”属性的html标记中,因此IE 11可以专门针对…

我需要检测IE与其他大部分,我不想依赖于UAstring。 我发现使用es6number确实是我想要的。 我不太关心这个变化,因为我不希望IE能够支持ES6号码。 所以现在我知道任何版本的IE与Edge / Chrome / Firefox / Opera / Safari的区别。

更多细节在这里: http : //caniuse.com/#feat=es6-number

请注意,我并不十分关心Opera Mini的错误否定。 你可能会。