Подтвердить что ты не робот

Вместо использования префиксов я хочу попросить посетителей сайта обновить браузер

Я перестраиваю сайт, используя CSS flexbox.

При проверке совместимости браузера, я вижу, что flexbox поддерживается всеми современными браузерами, за исключением того, что Safari 8 и IE 10 требуют поставщика префиксы.

При проверке Google Analytics я вижу, что 96% посетителей сайта за последние 6 месяцев используют браузеры, которые полностью поддерживают flexbox. Остальные 4% используют браузеры, которые требуют префиксов или не поддерживают.

Поскольку мы говорим о 4% пользователей, и число будет уменьшаться (и мне нравится, когда мой код как можно более чистый и простой), я рассматриваю возможность использования префиксов и вместо этого запрашиваю пользователей для обновления браузеров.

Как настроить таргетинг на старые браузеры, чтобы отображать сообщение пользователям, предлагающим обновить их браузер?

Вот что я до сих пор:

<!--[if IE]>
    <div class="browserupgrade">
        <p>You are using an outdated browser. Please <a href="#" onclick="location.href='http://browsehappy.com/'; return false;">
           upgrade your browser</a> to improve your experience.</p>
    </div>
<![endif]-->

Этот условный комментарий IE охватывает меня для версий IE 6, 7, 8 и 9.

Эти посетители получат предупреждение со ссылкой для загрузки текущего браузера. Однако Microsoft прекратила поддержку условных комментариев, начиная с IE10.

Теперь мне нужно что-то подобное для:

  • IE 10
  • Safari 7-8
  • Opera Mini < 8
  • UC Browser для Android
  • Android Browser < 4.4

Есть ли простой JS/jQuery script для работы с этим заданием? Или другой легкий метод?


Решение

Спасибо за все ответы. Ясно, что есть много способов решить эту проблему (Modernizr, PHP, jQuery-функции, простой Javascript, CSS, browser-update.org и т.д.). Многие из этих методов будут выполнять эту работу полностью и эффективно.

Я пошел с самым простым: CSS (кредит @LGSon).

Этот CSS охватывает практически все целевые браузеры, за исключением IE <= 7.

.browserupgrade { display: block; }
_:-ms-fullscreen, :root .browserupgrade { display: none; }
:-o-prefocus, .browserupgrade { display: none; }
@supports (display: flex) { .browserupgrade { display: none; }}

Подробнее см. ответ.

И для тех относительно немногих посетителей, которые используют IE <= 7, условный комментарий в HTML:

<!--[if lte IE 7]>
    <div style=" ... inline styles here ...">
        browser upgrade message here
    </div>
<![endif]-->
4b9b3361

Ответ 1

Пересмотренный ответ после редактирования вопроса

Вот только способ CSS для этого.

Поскольку CSS @supports не будет работать на ваших целевых (нежелательных) браузерах: Safari 7-8, IE <= 10, Android Browser < 4.4, UC Browser для Android и Opera Mini < 8, ваше сообщение "browserupgrade" будет видимым для тех, кто использует это правило.

@supports (display: flex) { .browserupgrade { display: none; }}

Существует несколько браузеров, которые по-прежнему поддерживают не префикс flex, но не поддерживают @supports, IE 11 (1) и Opera Mini 8, но, к счастью, мы можем обратиться их с несколькими правилами CSS.

/* IE 11 */
_:-ms-fullscreen, :root .browserupgrade { display: none; }

/* Opera Mini 8 */
:-o-prefocus, .browserupgrade { display: none; }

Вот полный код для показа обновления для ваших целевых браузеров.

CSS

.browserupgrade { display: block; }

/* IE 11 */
_:-ms-fullscreen, :root .browserupgrade { display: none; }

/* Opera Mini 8 */
:-o-prefocus, .browserupgrade { display: none; }

/* all modern browsers */
@supports (display: flex) { .browserupgrade { display: none; }}

HTML

<div class="browserupgrade">
    <p>You are using an outdated browser. Please <a href="http://browsehappy.com/">
       upgrade your browser</a> to improve your experience.</p>
</div>

(1): Правило IE 11 CSS должно работать и на IE Mobile 11, хотя не проверять его.


CSS @supports также доступен как API, CSS.supports(). Вот очень хорошо написанная статья Дэвида Уолша

Ответ 2

ПОМЕЩЕНИЕ

Свойство JavaScript style возвращает полный набор свойств CSS, поддерживаемых браузером для указанного элемента, который может быть протестирован с использованием следующего фрагмента:

for(var x in document.body.style)
    console.log(x);

Ответ 3

Вы можете использовать modernizr.js для обнаружения .

И затем напишите JavaScript, чтобы перенаправить пользователей на указанный выше URL, если функция не найдена.

Ответ 4

Да, у нас есть решение для этого...

сначала загрузите пользовательскую сборку Modernizr из (нажмите здесь -) https://modernizr.com/ (для свойства flexbox), затем добавьте последнюю страницу Jquery на свою страницу, добавьте таблицу стилей, и все будет готово!

(Примечание: нет необходимости загружать пользовательскую сборку Modernizr, вы можете использовать целую полную сборку непосредственно из Modernizr CDN, но по мере необходимости для проверки свойства Flexbox, поэтому я сказал вам загрузить пользовательскую сборку)

Проверьте этот скрипт flexbox скрипт поддержки

Вся ваша html-страница (с помощью css, jquery) будет выглядеть следующим образом:

<!doctype html>
<html class="no-js" lang="en">
<head>
    <meta charset="utf-8">
    <title>BroswerCheck</title>
    <style type="text/css">
        #browserupgrade{
            display:none;
            text-align:center;
            background:#F1070B;
            color:#FFFFFF;
            font-family:Segoe, "Segoe UI", Verdana, sans-serif;
            font-size:15px;
            padding:10px;}

        #browserupgrade a{
            color:#FFFFFF;
            background:#000000;
            text-decoration:none;
            padding:5px 15px;
            border-radius:25px;}
    </style>
    <script src="modernizr.js"></script>
</head>

<body>
    <div id="browserupgrade">
        <p>You are using an outdated browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
    </div>

    <script src="jquery-2.1.1.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            if (!Modernizr.flexbox) { $("#browserupgrade").show(); }
        });
    </script>
</body>
</html>

Ваши шаги будут,

1. Загрузите пользовательский Modernizr для обнаружения свойства Flexbox

2. создайте html-страницу с class= "no-js", добавленным в тег html

3. создать div для отображения сообщения и скрыть его

4. добавьте jquery и Modernizr на свою страницу

5. показать div, когда браузер не поддерживает flexbox -property

(для этой цели используйте свойство "Modernizr.flexbox", как показано выше script)

или если вы не хотите использовать JQuery, используйте следующий script (спасибо @Shaggy) как,

$(document).ready(function () { 
    if(!Modernizr.flexbox)document.getElementByID("browserupgrade").style.display="‌​block";
});

Ответ 5

EDIT:

Существуют два жизнеспособных подхода: Modernizr или Feature Queries. Modernizr - это текущее стабильное решение, но функциональные запросы @support, полностью поддерживаемые всеми браузерами, будут лучшим чистым решением для CSS для обнаружения функции css.

В настоящее время вам нужно добавить некоторые префиксы для таргетинга на те браузеры, которые не поддерживают запросы функций, т.е. см. ответ LGSon.

Современный подход:

Вы можете создать flexbox пользовательскую конструкцию Modernizr довольно просто, как было рекомендовано ранее: Modernizr Custom flexbox Build. Ссылка на свой собственный javascript файл modernizr на вашем сайте, а затем добавьте некоторые классы разметки HTML и Css, что-то вроде этого:

ПРИМЕЧАНИЕ.. Откройте фрагмент в разных браузерах, чтобы проверить поддержку.

ИСПЫТАНИЯ:

Нет flexbox поддержка: Internet Explorer 10

Flexbox поддержка: Chrome 50

/*! modernizr 3.3.1 (Custom Build) | MIT *
 * https://modernizr.com/download/?-flexbox-setclasses !*/
! function(e, n, t) {
  function r(e, n) {
    return typeof e === n
  }

  function o() {
    var e, n, t, o, s, i, a;
    for (var l in C)
      if (C.hasOwnProperty(l)) {
        if (e = [], n = C[l], n.name && (e.push(n.name.toLowerCase()), n.options && n.options.aliases && n.options.aliases.length))
          for (t = 0; t < n.options.aliases.length; t++) e.push(n.options.aliases[t].toLowerCase());
        for (o = r(n.fn, "function") ? n.fn() : n.fn, s = 0; s < e.length; s++) i = e[s], a = i.split("."), 1 === a.length ? Modernizr[a[0]] = o : (!Modernizr[a[0]] || Modernizr[a[0]] instanceof Boolean || (Modernizr[a[0]] = new Boolean(Modernizr[a[0]])), Modernizr[a[0]][a[1]] = o), g.push((o ? "" : "no-") + a.join("-"))
      }
  }

  function s(e) {
    var n = x.className,
      t = Modernizr._config.classPrefix || "";
    if (_ && (n = n.baseVal), Modernizr._config.enableJSClass) {
      var r = new RegExp("(^|\\s)" + t + "no-js(\\s|$)");
      n = n.replace(r, "$1" + t + "js$2")
    }
    Modernizr._config.enableClasses && (n += " " + t + e.join(" " + t), _ ? x.className.baseVal = n : x.className = n)
  }

  function i(e, n) {
    return !!~("" + e).indexOf(n)
  }

  function a() {
    return "function" != typeof n.createElement ? n.createElement(arguments[0]) : _ ? n.createElementNS.call(n, "http://www.w3.org/2000/svg", arguments[0]) : n.createElement.apply(n, arguments)
  }

  function l(e) {
    return e.replace(/([a-z])-([a-z])/g, function(e, n, t) {
      return n + t.toUpperCase()
    }).replace(/^-/, "")
  }

  function f(e, n) {
    return function() {
      return e.apply(n, arguments)
    }
  }

  function u(e, n, t) {
    var o;
    for (var s in e)
      if (e[s] in n) return t === !1 ? e[s] : (o = n[e[s]], r(o, "function") ? f(o, t || n) : o);
    return !1
  }

  function d(e) {
    return e.replace(/([A-Z])/g, function(e, n) {
      return "-" + n.toLowerCase()
    }).replace(/^ms-/, "-ms-")
  }

  function p() {
    var e = n.body;
    return e || (e = a(_ ? "svg" : "body"), e.fake = !0), e
  }

  function c(e, t, r, o) {
    var s, i, l, f, u = "modernizr",
      d = a("div"),
      c = p();
    if (parseInt(r, 10))
      for (; r--;) l = a("div"), l.id = o ? o[r] : u + (r + 1), d.appendChild(l);
    return s = a("style"), s.type = "text/css", s.id = "s" + u, (c.fake ? c : d).appendChild(s), c.appendChild(d), s.styleSheet ? s.styleSheet.cssText = e : s.appendChild(n.createTextNode(e)), d.id = u, c.fake && (c.style.background = "", c.style.overflow = "hidden", f = x.style.overflow, x.style.overflow = "hidden", x.appendChild(c)), i = t(d, e), c.fake ? (c.parentNode.removeChild(c), x.style.overflow = f, x.offsetHeight) : d.parentNode.removeChild(d), !!i
  }

  function m(n, r) {
    var o = n.length;
    if ("CSS" in e && "supports" in e.CSS) {
      for (; o--;)
        if (e.CSS.supports(d(n[o]), r)) return !0;
      return !1
    }
    if ("CSSSupportsRule" in e) {
      for (var s = []; o--;) s.push("(" + d(n[o]) + ":" + r + ")");
      return s = s.join(" or "), c("@supports (" + s + ") { #modernizr { position: absolute; } }", function(e) {
        return "absolute" == getComputedStyle(e, null).position
      })
    }
    return t
  }

  function h(e, n, o, s) {
    function f() {
      d && (delete z.style, delete z.modElem)
    }
    if (s = r(s, "undefined") ? !1 : s, !r(o, "undefined")) {
      var u = m(e, o);
      if (!r(u, "undefined")) return u
    }
    for (var d, p, c, h, v, y = ["modernizr", "tspan", "samp"]; !z.style && y.length;) d = !0, z.modElem = a(y.shift()), z.style = z.modElem.style;
    for (c = e.length, p = 0; c > p; p++)
      if (h = e[p], v = z.style[h], i(h, "-") && (h = l(h)), z.style[h] !== t) {
        if (s || r(o, "undefined")) return f(), "pfx" == n ? h : !0;
        try {
          z.style[h] = o
        } catch (g) {}
        if (z.style[h] != v) return f(), "pfx" == n ? h : !0
      }
    return f(), !1
  }

  function v(e, n, t, o, s) {
    var i = e.charAt(0).toUpperCase() + e.slice(1),
      a = (e + " " + b.join(i + " ") + i).split(" ");
    return r(n, "string") || r(n, "undefined") ? h(a, n, o, s) : (a = (e + " " + E.join(i + " ") + i).split(" "), u(a, n, t))
  }

  function y(e, n, r) {
    return v(e, t, t, n, r)
  }
  var g = [],
    C = [],
    w = {
      _version: "3.3.1",
      _config: {
        classPrefix: "",
        enableClasses: !0,
        enableJSClass: !0,
        usePrefixes: !0
      },
      _q: [],
      on: function(e, n) {
        var t = this;
        setTimeout(function() {
          n(t[e])
        }, 0)
      },
      addTest: function(e, n, t) {
        C.push({
          name: e,
          fn: n,
          options: t
        })
      },
      addAsyncTest: function(e) {
        C.push({
          name: null,
          fn: e
        })
      }
    },
    Modernizr = function() {};
  Modernizr.prototype = w, Modernizr = new Modernizr;
  var x = n.documentElement,
    _ = "svg" === x.nodeName.toLowerCase(),
    S = "Moz O ms Webkit",
    b = w._config.usePrefixes ? S.split(" ") : [];
  w._cssomPrefixes = b;
  var E = w._config.usePrefixes ? S.toLowerCase().split(" ") : [];
  w._domPrefixes = E;
  var P = {
    elem: a("modernizr")
  };
  Modernizr._q.push(function() {
    delete P.elem
  });
  var z = {
    style: P.elem.style
  };
  Modernizr._q.unshift(function() {
    delete z.style
  }), w.testAllProps = v, w.testAllProps = y, Modernizr.addTest("flexbox", y("flexBasis", "1px", !0)), o(), s(g), delete w.addTest, delete w.addAsyncTest;
  for (var N = 0; N < Modernizr._q.length; N++) Modernizr._q[N]();
  e.Modernizr = Modernizr
}(window, document);
.support-container {
  display: none;
}
.no-flexbox .support-container {
  display: block;
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: #CE3426;
  padding: 100px;
}
.support-container__update-browser {
  color: #ffffff;
  font-size: 2em;
}
.support-container__can-i-use {
  font-size: 1.2em;
  font-style: italic;
  color: #dddddd;
}
.support-container__update-browser a,
.support-container__can-i-use a {
  background-color: #ffffff;
  text-decoration: underline;
  padding: 0 3px;
  border-radius: 4px;
  border-bottom: 2px solid rgba(0, 0, 0, 0.3);
}
<div class="support-container">
  <div id="browserupgrade" class="support-container__update-browser">
    <p>Dear user, you are using an outdated browser. Please
      <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
  </div>
  <div class="support-container__can-i-use">
    <p>
      For more browser support info click
      <a href="http://caniuse.com/#feat=flexbox">here</a>
      .
    </p>
  </div>
</div>

Ответ 6

Хорошо, также предлагаю использовать modernizr (скачать с https://modernizr.com/), но немного по-другому. Я считаю, что ваша фактическая проблема заключается только в том, чтобы определить, поддерживает ли браузер flexbox или нет, а не если это конкретный браузер или версия браузера.

После установки и загрузки вашей страницы, modernizr поместит классы в тег <body>. Что касается flexbox, он поместит в тег body как класс .flexbox ИЛИ класс .no-flexbox, например <body class="no-flexbox bgsizecover csscalc"> (и на самом деле много других классов, если вы не загрузите пользовательскую сборку modernizr только для flexbox). Таким образом, вы можете использовать простой комбинированный селектор для правила CSS, который выбирает блок DIV, в который вы пишете предупреждение о устаревшем браузере. Пример:

В HTML напишите что-нибудь вроде:

<div class="browserwarning">Your browser is outdated and cannot display this page properly! Please install an up-to-date browser, which you can get from <a href="http://www.example.com">here</a>.</div>

В таблице стилей CSS добавьте следующее:

.browserwarning {
  display: none;
}
.no-flexbox .browserwarning {
  display: block;
  font-size: 24px;
  color: red;
  background-color: yellow;
}

Это сначала скроет это сообщение (по первому правилу), а затем (второе правило) отобразит его только в браузерах, которые не могут обрабатывать flexbox, и поэтому класс .no-flexbox помещается в тег body modernizr при загрузке страницы: комбинированный селектор .no-flexbox .browserwarning работает независимо от того, где в теле размещено предупреждение браузера - он не должен быть прямым дочерним элементом body, но может быть где угодно.

Это работает точно - я использовал это на страницах, которые я успешно выполнил...

Ответ 7

На передней панели вы можете использовать библиотеку modernizr и определить, поддерживает ли браузер современные функции, которые вы используете.

Еще одна вещь, которую нужно сделать, - это перенаправить непосредственно из задней части на специальную страницу. Если вы используете PHP для задней части, вы можете использовать функцию get_browser для обнаружения пользовательского агента, а затем загрузить обычную страницу или если браузер является одним из неподдерживаемых браузеров, откройте страницу, предлагающую пользователям обновиться.

http://php.net/manual/en/function.get-browser.php

Ответ 8

Более тщательный подход.

Вы можете получить строки пользовательского агента для каждого интересующего вас браузера и создать массив из всех тех, которые вы хотите исключить.

Используйте navigator.userAgent для получения пользовательского агента посетителя и проверьте, находится ли он в массиве не поддерживаемых браузеров, используя jQuery inArray()

Простой оповещение javascript может быть брошен для посетителей, используя браузер, который является совпадением.

Вот пример получения информации, связанной с браузером (пример source: w3schools.com)

var txt = "";
txt += "<p>User-agent header: " + navigator.userAgent + "</p>";
txt += "<p>Browser CodeName: " + navigator.appCodeName + "</p>";
txt += "<p>Browser Name: " + navigator.appName + "</p>";
txt += "<p>Browser Version: " + navigator.appVersion + "</p>";
txt += "<p>Cookies Enabled: " + navigator.cookieEnabled + "</p>";
txt += "<p>Browser Language: " + navigator.language + "</p>";
txt += "<p>Browser Online: " + navigator.onLine + "</p>";
txt += "<p>Platform: " + navigator.platform + "</p>";

document.getElementById("demo").innerHTML = txt;
<div id="demo"></div>

Ответ 9

Вы также можете вставить префиксы в таблицу стилей. Проверьте, действительно ли свойство стиля браузеров поддерживает свойства стиля, которые уже присутствуют, или динамически вставляются позже. Составил его в первую очередь для анимации, хотя его можно было модифицировать, чтобы протестировать любое свойство стиля css в браузере. Если props уже присутствует в stylesheet, префиксы поставщика вставляются в stylesheet. Если реквизит позже динамически вставлен, префиксы поставщиков также вставлены или прикреплены к этим реквизитам.

Например, добавление префиксов для animation, backface-visibility, border-radius, box-shadow, transform, transform-style, transition; также установив префикс в @keyframes

(function prefix() {
    // var el = $(selector).get(0), i.e.g, $("body").get(0), $("#animated").get(0)
    var prefixes = {"MozAnimation": "-moz-","webkitAnimation": "-webkit-"
                   ,"msAnimation": "-ms-","oAnimation": "-o-"};
    var props = ["animation", "backface-visibility", "border-radius"
                , "box-shadow", "transform", "transform-style", "transition"];
    $.each(prefixes, function(key, val) {
        $("style")
        .attr({"data-prefix": val,"class": String(val).replace(/-/g, "")});
        return !(key in el.style);
    });
    $.each(props, function(index, value) {
        var cssPrefix = $("style").attr("data-prefix");
        if (value in el.style === false) {
            $.fn.pfx = function(prop, pfxprop, q) {
                return $("style").html($("style").text()
                       .replace(new RegExp(prop, "g"), q 
                       + $("style").attr("data-prefix") + pfxprop))
            };
            $("style").pfx("@keyframes", "keyframes", "@")
            .pfx(value, value, "");
        };
    });
}());

github https://github.com/guest271314/prefix/blob/master/prefix.1.1.min.js

Ответ 10

Вы можете использовать UAParser.js. Он может дать вам имя браузера, версию, os и т.д. Здесь пример.

Для него есть плагин jQuery.

var parser = new UAParser();
var browser = parser.getBrowser();

// leave only the major version and minor in order to compare
// eg 12.2.4 > 12.2
var secondDot = browser.version.indexOf(".", browser.version.indexOf(".") + 1);
browser.version = parseFloat(browser.version.substr(0, secondDot));

// debugging
$("#browserName").html(browser.name);
$("#browserVersion").html(browser.version);

if (["IE", "Safari", "Opera Mobi", "UCBrowser", "Android Browser"].indexOf(browser.name) != -1) {
    if (browser.name == "IE" && browser.version <= 10) {
        $("#browserupgrade").show();
    }
    if (browser.name == "Safari" && browser.version <= 10) {
        $("#browserupgrade").show();
    }
    if (browser.name == "UCBrowser") {
        $("#browserupgrade").show();
    }
    if (browser.name == "Android Browser" && browser.version <= 4.4) {
        $("#browserupgrade").show();
    }
}

Ответ 11

Эта одна строка проверит значение ie10 и вернет true, если ie10 или false в противном случае.

var ie10 = /MSIE 10/i.test(navigator.userAgent) && /MSIE 10/i.test(navigator.vendor);

Мои исследования здесь: https://blogs.msdn.microsoft.com/ie/2011/04/15/the-ie10-user-agent-string/

случай использования

Вариант 1

 if(ie10){

    //Do something

    }

ОБНОВЛЕНИЕ:

В браузерах Microsoft используется @cc_on, что позволит вам инициировать условные комментарии через script.

Вариант 2:

<script>
/*@cc_on

 @if (@_jscript_version == 10){

 document.write("You are using IE10");
}
@*/
</script>

FYI. Только EI 10 и ниже не поддерживают flexbox css. Доказательство здесь: http://caniuse.com/#feat=flexbox

Надеюсь, что это поможет

Ответ 12

Смотрите: https://browser-update.org/

<script> 
var $buoop = {c:2}; 
function $buo_f(){ 
 var e = document.createElement("script"); 
 e.src = "//browser-update.org/update.min.js"; 
 document.body.appendChild(e);
};
try {document.addEventListener("DOMContentLoaded", $buo_f,false)}
catch(e){window.attachEvent("onload", $buo_f)}
</script> 

Imgur

Ответ 13

Или другой легкий метод?

Если вы обслуживаете свою страницу через nginx, существует очень полезная директива ancient_browser.

Вам нужно установить список браузеров, которые вы не хотите поддерживать:

ancient_browser msie 9.0;

а затем перенаправить их на специальную страницу обновления браузера:

if ($ancient_browser) {
    rewrite ^ /install-chrome.html;
}

Таким образом, вы не загрязняете уже существующие страницы и не нуждаетесь в загрузке дополнительных css для пользователей, которым это не нужно.

Ответ 14

Вы можете использовать следующие функции для получения имени и версии браузера:

function get_browser() {
        var ua = navigator.userAgent, tem, M = ua
                .match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)
                || [];
        if (/trident/i.test(M[1])) {
            tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
            return 'IE ' + (tem[1] || '');
        }
        if (M[1] === 'Chrome') {
            tem = ua.match(/\bOPR\/(\d+)/)
            if (tem != null) {
                return 'Opera ' + tem[1];
            }
        }
        M = M[2] ? [ M[1], M[2] ] : [ navigator.appName, navigator.appVersion,
                '-?' ];
        if ((tem = ua.match(/version\/(\d+)/i)) != null) {
            M.splice(1, 1, tem[1]);
        }
        return M[0];
    }

    function get_browser_version() {
        var ua = navigator.userAgent, tem, M = ua
                .match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)
                || [];
        if (/trident/i.test(M[1])) {
            tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
            return 'IE ' + (tem[1] || '');
        }
        if (M[1] === 'Chrome') {
            tem = ua.match(/\bOPR\/(\d+)/)
            if (tem != null) {
                return 'Opera ' + tem[1];
            }
        }
        M = M[2] ? [ M[1], M[2] ] : [ navigator.appName, navigator.appVersion,
                '-?' ];
        if ((tem = ua.match(/version\/(\d+)/i)) != null) {
            M.splice(1, 1, tem[1]);
        }
        return M[1];
    }

, и вы можете использовать следующий код, чтобы предупредить пользователя об обновлении браузера.

    jQuery(document).ready(function() {
        var browser = get_browser();
        var browser_version = get_browser_version();
        if (browser == "Chrome" && browser_version <= 30) {
            alert("Your browser is below the minimum required version. Please update your browser for this site to function properly");
        }
        if (browser == "Firefox" && browser_version <= 25) {
            alert("Your browser is below the minimum required version. Please update your browser for this site to function properly");
        }
        if (browser == "MSIE" && browser_version <= 8) {
            alert("Your browser is below the minimum required version. Please update your browser for this site to function properly");
        }
    });

Ответ 15

Попробуйте следующее:

navigator.browser = (function() {
    var ua = navigator.userAgent, tem,
        M  = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
    if (/trident/i.test(M[1])) {
        tem =  /\brv[ :]+(\d+)/g.exec(ua) || [];
        return 'IE '+(tem[1] || '');
    }
    if (M[1]=== 'Chrome') {
        tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
        if (tem != null) return tem.slice(1).join(' ').replace('OPR', 'Opera');
    }
    M = M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if ((tem = ua.match(/version\/(\d+)/i))!= null)
        M.splice(1, 1, tem[1]);
    return M.join(' ');
})();

Но вы пытаетесь изобрести колесо, с помощью Modernizr вы можете сделать:

if (Modernizr.flexbox) {
  // Modern Flexbox supported
}
else {
  // Flexbox syntax not supported
}