четверг, 8 октября 2009 г.

Неправильная работа в JQuery функции $.browser.version для IE выше 6 версии. Incorrect work JQuery function $.browser.version for IE 6 version above

Совершенно неожиданно для себя, я открыл серьезный глюк в моем любимом Jquery. Если бы мне кто-то сказал, что функция определения версии броузера $.browser.version работает неправильно, я бы спорил на что угодно, что он неправ. Но....

Как известно, все познается на практике. Я совершенно случайно сделал такой финт:

alert('Browser version: '+ $.browser.version);

Каково же было мое удивление, когда я увидел на экране моего броузера IE8 попап: «Browser version: 6.0»!

Я немного погуглял и выяснилось – да, действительно, вражеская бажина... Для всех IE > 6 выводится, что текущая версия експлорера - 6.

Посмотрев множество решений проблемы, перечитав кучу статей, я собрал воедино все лучшее и переопределил для JQuery метод $.browser.version. Чтобы и у вас все работало правильно, необходимо переопределить в $(document).ready обработку таким образом:

(function($) {
  var userAgent = navigator.userAgent.toLowerCase();
  var ie_version = -1;
  if (navigator.appName == 'Microsoft Internet Explorer') {
   var re = new RegExp("msie ([0-9]{1,}[\.0-9]{0,})");
   if (re.exec(userAgent) != null)
   ie_version = parseFloat(RegExp.$1);
  }
  $.browser = {
    version: (ie_version>-1)?ie_version:(userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
    safari: /webkit/.test( userAgent ),
    opera: /opera/.test( userAgent ),
    msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
    mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
  };
})(jQuery);

Коментарии в коде думаю не понадобятся, тут все предельно ясно: для ИЕ надо использовать отдельное регулярное выражение. Так как дефолтное работает неправильно.