Как обнаружить браузер с помощью angularjs?
Я новичок в angularjs. Как я могу обнаружить userAgent в angularjs. Можно ли использовать это в контроллере? Попробовал что-то вроде ниже, но не повезло!
var browserVersion = int((/msie (d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);
Мне нужно обнаружить IE9 специально!
11 ответов:
как Элиран Малка спросил, почему вам нужно проверить IE 9?
обнаружение браузера сделать и версия, как правило, плохой запах. Это обычно означает, что у вас есть большая проблема с кодом, если вам нужен JavaScript для обнаружения конкретных версий браузера.
есть подлинные случаи, когда функция не будет работать, как говорят WebSockets не поддерживается в IE 8 или 9. Это должно быть решено путем проверки поддержки WebSocket и применения polyfill, если есть нет родной поддержки.
это должно быть сделано с библиотекой, как Modernizr.
это, как говорится, вы можете легко создать сервис, который будет вернуть браузер. Существуют допустимые случаи, когда функция существует в браузере, но реализация устарела или сломана. 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'; } }]);
исправлена опечатка broswers
Примечание: это просто пример того, как создать службу в угловой, который будет нюхать строку userAgent. Это просто пример кода, который не должен работать в рабочей среде и сообщать обо всех браузерах во всех ситуациях.
обновление
вероятно, лучше всего использовать стороннюю библиотеку, такую как https://github.com/ded/bowser или https://github.com/darcyclarke/Detect.js. эти библиотеки помещают объект на
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);
затем вы бы ввели один из них обычным способом и использовали API, предоставленный lib. Если вы решите использовать другой lib, который вместо этого использует метод конструктора, вы создадите фабрику, которая создает его экземпляр:
function someLibFactory() { return new SomeLib(); } angular.module('yourModule').factory('someLib', someLibFactory);
затем вы введете это в свои контроллеры и службы обычным способом.
если библиотека, которую вы вводите, точно не соответствует ваши требования, вы можете использовать
Adapter Pattern
где вы создаете класс/конструктор с точными методами нужно.в этом примере нам просто нужно проверить IE 9, и мы будем использовать
bowser
lib выше.BrowserAdapter.$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.
обновление
на самом деле эти ценности никогда не меняются. Если вы загрузите страницу в IE 9, она никогда не станет Chrome 44. Поэтому вместо регистрации BrowserAdapter в качестве сервиса, просто поместите результат в
value
илиconstant
.angular.module('app').value('isIe9', broswerAdapter.isIe9);
Угловое библиотека использует документ.documentMode для идентификации IE . Он содержит основной номер версии для IE или NaN/undefined, если пользовательский агент не является IE.
/** * 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 (угловая обертка для окна.документ)
// 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 в ваших контроллерах.
не уверен, почему вы указываете, что он должен быть в угловой. Это легко сделать с помощью JavaScript. Посмотрите на
navigator
вы можете легко использовать модуль "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); }]);
Итак, вы можете объявить больше утилит для angular, создав файл с содержимым (я следую за библиотекой 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 SampleController($scope){ $scope.click = function () { if(angular.ISCHROME) { alert("is chrome"); } }
Я изменил вышеописанную технику, которая была близка к тому, что я хотел для углового и превратил ее в сервис :-). Я включил 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-устройство-детектор, который делает обнаружение объектов, таких как браузер, ОС легко.
вот учебник, который объясняет, как использовать эту библиотеку. обнаружение ОС, браузера и устройства в AngularJS
вам нужно добавить re-дерево.js и ng-устройство-детектор.js скрипты в ваш html
Inject "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. }
браузер нюхать, как правило, следует избегать, функция обнаружения намного лучше, но иногда вы должны сделать это. Например, в моем случае Windows 8 планшеты перекрывает окно браузера с клавиатуры; смешно я знаю, но иногда вам приходится иметь дело с реальностью.
Так что вы бы измерить ' навигатор.userAgent ' как и с обычным JavaScript (пожалуйста, не впадайте в привычку рассматривать Angular как что-то отличное от JavaScript, используйте простой JavaScript, если это возможно приведет к меньшему будущему рефакторингу).
однако для тестирования вы хотите использовать вводимые объекты, а не глобальные. Поскольку ' $location 'не содержит userAgent, простой трюк заключается в использовании' $window.местоположение.userAgent'. Теперь вы можете писать тесты, которые вводят заглушку $window с любым userAgent, который вы не хотите имитировать.
Я не использовал его в течение многих лет, но Modernizr является хорошим источником кода для проверки функций. https://github.com/Modernizr/Modernizr/issues/878#issuecomment-41448059