Как обнаружить браузер с помощью angularjs?


Я новичок в angularjs. Как я могу обнаружить userAgent в angularjs. Можно ли использовать это в контроллере? Попробовал что-то вроде ниже, но не повезло!

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

Мне нужно обнаружить IE9 специально!

11 58

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

ngDeviceDetector

вам нужно добавить 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

обнаружение 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
}