使用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的错误否定。 你可能会。