如何使用angular度检测浏览器?

我是新angular度。 我如何检测angular度userAgent。 有没有可能在控制器中使用它? 试过下面的东西,但没有运气!

var browserVersion = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]); 

我需要专门检测IE9!

像Eliran Malka问,为什么你需要检查IE 9?

检测浏览器的版本和版本通常是一个难闻的气味。 这通常意味着如果您需要使用JavaScript来检测特定版本的浏览器,则代码中存在更大的问题。

有一些function无法正常工作的真实情况,比如说IE 8或9中不支持WebSocket。这应该通过检查WebSocket支持来解决,并且在没有本地支持的情况下应用一个polyfill。

这应该用像Modernizr这样的库来完成。

这就是说,你可以轻松地创build将返回浏览器的服务。 在浏览器中存在function的情况下有效,但是实现过时或中断。 Modernizr不适合这些情况。

 app.service('browser', ['$window', function($window) { return function() { var userAgent = $window.navigator.userAgent; var browsers = {chrome: /chrome/i, safari: /safari/i, firefox: /firefox/i, ie: /internet explorer/i}; for(var key in browsers) { if (browsers[key].test(userAgent)) { return key; } }; return 'unknown'; } }]); 

修正了错字串

注意:这只是一个如何创build一个angular度的服务,将嗅探userAgentstring的一个例子。 这只是一个代码示例,预计不会在生产环境中工作,并在所有情况下报告所有浏览器。

UPDATE

最好使用https://github.com/ded/bowser或https://github.com/darcyclarke/Detect.js等第三方库。; 这些库在一个名为bowser的window上放置一个对象或分别检测。

然后,您可以将其暴露给Angular IoC Container如下所示:

 angular.module('yourModule').value('bowser', bowser); 

要么

 detectFactory.$inject = ['$window']; function detectFactory($window) { return detect.parse($window.navigator.userAgent); } angular.module('yourModule').factory('detect', detectFactory); 

然后你可以用通常的方法注入其中的一种,并使用lib提供的API。 如果您select使用另一个使用构造函数方法的库,则可以创build一个工厂来实例化它:

 function someLibFactory() { return new SomeLib(); } angular.module('yourModule').factory('someLib', someLibFactory); 

然后,你会注入到您的控制器和服务的正常方式。

如果您注入的库与您的需求不完全匹配,那么您可能需要使用Adapter Pattern ,在其中创build具有所需确切方法的类/构造函数。

在这个例子中,我们只需要testingIE9,我们将使用上面的bowser lib。

 BroswerAdapter.$inject = ['bowser']; // bring in lib function BrowserAdapter(bowser) { this.bowser = bowser; } BrowserAdapter.prototype.isIe9 = function() { return this.bowser.msie && this.browser.version == 9; } angular.module('yourModule').service('browserAdapter', BrowserAdapter); 

现在在一个控制器或服务,你可以注入browserAdapter ,只要做if (browserAdapter.isIe9) { // do something }

如果稍后想要使用detect而不是bowser,则代码中的更改将与BrowserAdapter分离。

UPDATE

事实上,这些价值从不改变。 如果您在IE 9中加载页面,它将永远不会成为Chrome浏览器44.因此,不要将BrowserAdapter注册为服务,只需将结果放入一个valueconstant

 angular.module('app').value('isIe9', broswerAdapter.isIe9); 

Angular库使用document.documentMode来识别IE。 它包含IE的主要版本号,如果用户代理不是IE,则为NaN / undefined。

 /** * documentMode is an IE-only property * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx */ var msie = document.documentMode; 

https://github.com/angular/angular.js/blob/v1.5.0/src/Angular.js#L167-L171

$ document的示例(window.document的包angular)

 // var msie = document.documentMode; var msie = $document[0].documentMode; // if is IE (documentMode contains IE version) if (msie) { // IE logic here if (msie === 9) { // IE 9 logic here } } 

你应该使用条件注释

 <!--[if IE 9]> <script type="text/javascript"> window.isIE9 = true; </script> <![endif]--> 

然后你可以在你的控制器中检查$ window.isIE9。

不知道为什么你指定它必须在Angular内。 这很容易通过JavaScript来完成。 看看navigator对象。

只要打开你的控制台,并检查navigator 。 看起来你正在寻找的是.userAgent.appVersion

我没有安装IE9,但你可以尝试下面的代码

 //Detect if IE 9 if(navigator.appVersion.indexOf("MSIE 9.")!=-1) 

您可以轻松使用“ng-device-detector”模块。

https://github.com/srfrnk/ng-device-detector

 var app = angular.module('myapp', ["ng.deviceDetector"]); app.controller('DeviceCtrl', ["$scope","deviceDetector",function($scope,deviceDetector) { console.log("browser: ", deviceDetector.browser); console.log("browser version: ", deviceDetector.browser_version); console.log("device: ", deviceDetector.device); }]); 

所以,你可以通过创build带有内容的文件来声明更多的实用工具(我遵循RGraph库)

 (function(window, angular, undefined) {'use strict'; var agl = angular || {}; var ua = navigator.userAgent; agl.ISFF = ua.indexOf('Firefox') != -1; agl.ISOPERA = ua.indexOf('Opera') != -1; agl.ISCHROME = ua.indexOf('Chrome') != -1; agl.ISSAFARI = ua.indexOf('Safari') != -1 && !agl.ISCHROME; agl.ISWEBKIT = ua.indexOf('WebKit') != -1; agl.ISIE = ua.indexOf('Trident') > 0 || navigator.userAgent.indexOf('MSIE') > 0; agl.ISIE6 = ua.indexOf('MSIE 6') > 0; agl.ISIE7 = ua.indexOf('MSIE 7') > 0; agl.ISIE8 = ua.indexOf('MSIE 8') > 0; agl.ISIE9 = ua.indexOf('MSIE 9') > 0; agl.ISIE10 = ua.indexOf('MSIE 10') > 0; agl.ISOLD = agl.ISIE6 || agl.ISIE7 || agl.ISIE8; // MUST be here agl.ISIE11UP = ua.indexOf('MSIE') == -1 && ua.indexOf('Trident') > 0; agl.ISIE10UP = agl.ISIE10 || agl.ISIE11UP; agl.ISIE9UP = agl.ISIE9 || agl.ISIE10UP; })(window, window.angular); 

之后,在你的function使用可以使用它

 function SampleController($scope){ $scope.click = function () { if(angular.ISCHROME) { alert("is chrome"); } } 

我修改了上面的技术,接近我想要的angular度,并把它变成一个服务:-)。 我包括ie9因为我的angularjs应用程序中有一些问题,但可能是我正在做的事情,所以随时拿出来。

 angular.module('myModule').service('browserDetectionService', function() { return { isCompatible: function () { var browserInfo = navigator.userAgent; var browserFlags = {}; browserFlags.ISFF = browserInfo.indexOf('Firefox') != -1; browserFlags.ISOPERA = browserInfo.indexOf('Opera') != -1; browserFlags.ISCHROME = browserInfo.indexOf('Chrome') != -1; browserFlags.ISSAFARI = browserInfo.indexOf('Safari') != -1 && !browserFlags.ISCHROME; browserFlags.ISWEBKIT = browserInfo.indexOf('WebKit') != -1; browserFlags.ISIE = browserInfo.indexOf('Trident') > 0 || navigator.userAgent.indexOf('MSIE') > 0; browserFlags.ISIE6 = browserInfo.indexOf('MSIE 6') > 0; browserFlags.ISIE7 = browserInfo.indexOf('MSIE 7') > 0; browserFlags.ISIE8 = browserInfo.indexOf('MSIE 8') > 0; browserFlags.ISIE9 = browserInfo.indexOf('MSIE 9') > 0; browserFlags.ISIE10 = browserInfo.indexOf('MSIE 10') > 0; browserFlags.ISOLD = browserFlags.ISIE6 || browserFlags.ISIE7 || browserFlags.ISIE8 || browserFlags.ISIE9; // MUST be here browserFlags.ISIE11UP = browserInfo.indexOf('MSIE') == -1 && browserInfo.indexOf('Trident') > 0; browserFlags.ISIE10UP = browserFlags.ISIE10 || browserFlags.ISIE11UP; browserFlags.ISIE9UP = browserFlags.ISIE9 || browserFlags.ISIE10UP; return !browserFlags.ISOLD; } }; }); 

有一个图书馆ng-device-detector使得像浏览器,操作系统的检测实体很容易。

这里是解释如何使用这个库的教程。 检测AngularJS中的操作系统,浏览器和设备

ngDeviceDetector

您需要将re-tree.js和ng-device-detector.js脚本添加到您的html中

在模块中注入“ng.deviceDetector”作为依赖项。

然后将数据库提供的“deviceDetector”服务注入您想要的数据的控制器或工厂。

“deviceDetector”包含所有关于浏览器,操作系统和设备的数据。

为什么不使用document.documentMode只能在IE下使用:

 var doc = $window.document; if (!!doc.documentMode) { if (doc.documentMode === 10) { doc.documentElement.className += ' isIE isIE10'; } else if (doc.documentMode === 11) { doc.documentElement.className += ' isIE isIE11'; } // etc. } 

通常应该避免浏览器嗅探,function检测要好得多,但有时你必须这样做。 例如在我的情况下,Windows 8 Tablets与软键盘重叠浏览器窗口; 我知道可笑,但有时你必须面对现实。

所以你可以像使用普通的JavaScript一样测量'navigator.userAgent'(请不要把Angular看作与JavaScript截然不同的习惯,如果可能的话,使用普通的JavaScript会导致更less的将来的重构)。

但是为了testing你想使用注入的对象而不是全局的对象。 由于'$ location'不包含userAgent,所以简单的技巧就是使用'$ window.location.userAgent'。 您现在可以编写testing,将任何您不想模拟的userAgent注入$ window stub。

检测ie9 +

 var userAgent, ieReg, ie; userAgent = $window.navigator.userAgent; ieReg = /msie|Trident.*rv[ :]*11\./gi; ie = ieReg.test(userAgent); if (ie) { // js for ie9,10 and 11 }