jQuery, определение браузера
7 июля 2008
Заметил, что jQuery.browser.version неверно определяет версию IE. Седьмой считается шестым.
Ошибка уже в трэкере, но ещё не поправлена:
http://dev.jquery.com/ticket/1867
http://dev.jquery.com/ticket/2661
http://dev.jquery.com/ticket/2413
user-agent, отдаваемый IE7 сменился с последними обновлениями на:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
Соответственно регулярка совпала с MSIE 6.0.
Мораль: user-agent — штука ненадёжная. Лучше проверять наличие объектов, например:
//IE6 if (window.external && (typeof window.XMLHttpRequest == "undefined")) { //… }



Комментарии RSS по email OK
Код определения браузера в jQuery невероятно глючный. Что неудивительно учитывая такие user-agent, к тому же сторонние приложения вносят свою лепту user-agent, к примеру, раньше был баг когда наличие Mail.Ru Agent путалось с Opera, насколько я помню там в регулярке было /ra/ (сократили объем кода типа :)
Оно, кажется, там и сейчас есть…
Для определения версии IE обычно использую условные комментарии:
в результате вычисления этого нехитрого выражения в переменной ie будет лежать номер версии IE начиная с 5 (IE5.5), правда IE8b определяется как IE7, но это пока что не актуально. В случае использования нормального браузера, переменная ie равна 0. Идею взял отсюда.
Блин, при постинге код порезало, там еще после умножения на 10 вычисляется остаток от деления на 10
public class browserInfo { private String userAgent; public browserInfo(String userAgent) { this.userAgent = userAgent; } // Property that returns formatted browser name (Full name, Version and OS) public String getFullBrowser { get { return (this.getFullName + " " + this.getVersion + " " + this.getFullOS); } } public String getName { get { String getNameRes = "Unknown"; //Leave Mozilla on this position because others are based on Mozilla technology if (userAgent.Contains("Mozilla")) getNameRes = "mz"; //Mozilla if (userAgent.Contains("Firebird")) getNameRes = "fb"; //Mozilla Firebird if (userAgent.Contains("Firefox")) getNameRes = "ff"; //Mozilla Firefox if (userAgent.Contains("K-Meleon")) getNameRes = "km"; //Mozilla K-Meleon if (userAgent.Contains("Phoenix")) getNameRes = "px"; //Mozilla Phoenix //Leave MSIE on this position because others are based on MSIE technology if (userAgent.Contains("MSIE")) getNameRes = "ie"; //Internet Explorer if (userAgent.Contains("Crazy")) getNameRes = "cb"; //Crazy Browser if (userAgent.Contains("Galeon")) getNameRes = "gl"; //Galeon if (userAgent.Contains("Konqueror")) getNameRes = "kq"; //Konqueror if (userAgent.Contains("Opera")) getNameRes = "op"; //Opera if (userAgent.Contains("Safari")) getNameRes = "sf"; //Safari if (userAgent.Contains("Lotus-Notes")) getNameRes = "ln"; //Lotus-Notes if (userAgent.Contains("Lynx")) getNameRes = "lx"; //Lynx if (userAgent.Contains("Netscape") || userAgent.Contains("Nav")) getNameRes = "ns"; //Netscape return getNameRes; } } public String getFullName { get { String getFullNameRes = "Unknown"; //Leave Mozilla on this position because others are based on Mozilla technology if (userAgent.Contains("Mozilla")) getFullNameRes = "Mozilla"; //Mozilla if (userAgent.Contains("Firebird")) getFullNameRes = "Mozilla Firebird"; //Mozilla Firebird if (userAgent.Contains("Firefox")) getFullNameRes = "Mozilla Firefox"; //Mozilla Firefox if (userAgent.Contains("K-Meleon")) getFullNameRes = "Mozilla K-Meleon"; //Mozilla K-Meleon if (userAgent.Contains("Phoenix")) getFullNameRes = "Mozilla Phoenix"; //Mozilla Phoenix //Leave MSIE on this position because others are based on MSIE technology if (userAgent.Contains("MSIE")) getFullNameRes = "Internet Explorer"; //Internet Explorer if (userAgent.Contains("Crazy")) getFullNameRes = "Crazy Browser"; //Crazy Browser if (userAgent.Contains("Galeon")) getFullNameRes = "Galeon"; //Galeon if (userAgent.Contains("Konqueror")) getFullNameRes = "Konqueror"; //Konqueror if (userAgent.Contains("Opera")) getFullNameRes = "Opera"; //Opera if (userAgent.Contains("Safari")) getFullNameRes = "Safari"; //Safari if (userAgent.Contains("Lotus-Notes")) getFullNameRes = "Lotus Notes"; //Lotus-Notes if (userAgent.Contains("Lynx")) getFullNameRes = "Lynx"; //Lynx if (userAgent.Contains("Netscape") || userAgent.Contains("Nav")) //Netscape getFullNameRes = "Netscape"; return getFullNameRes; } } public String getVersion { get { String getVersionRes = "???"; if (userAgent.Contains("Mozilla")) { if (userAgent.Contains("rv")) getVersionRes = MySafeSubstring(userAgent.IndexOf("rv") + 3, 3); }; if (userAgent.Contains("MSIE")) { getVersionRes = MySafeSubstring(userAgent.IndexOf("MSIE")+5,4); if (MySafeSubstring(getVersionRes, 3, 1) == ";") getVersionRes = MySafeSubstring(userAgent.IndexOf("MSIE")+5,3); }; if (userAgent.Contains("Firebird")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Firebird")+9,4); if (userAgent.Contains("Firefox")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Firefox")+8,3); if (userAgent.Contains("K-Meleon")) { getVersionRes = MySafeSubstring(userAgent.IndexOf("K-Meleon")+9,5); if (getVersionRes.Length < 4) getVersionRes = MySafeSubstring(userAgent.IndexOf("K-Meleon")+9,3); }; if (userAgent.Contains("Phoenix")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Phoenix")+8,3); if (userAgent.Contains("Crazy")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Crazy Browser")+14,5); if (userAgent.Contains("Galeon")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Galeon")+7,6); if (userAgent.Contains("Konqueror")) { getVersionRes = MySafeSubstring(userAgent.IndexOf("Konqueror")+10,5); if ((MySafeSubstring(getVersionRes, 1, 1) == ";") || (MySafeSubstring(getVersionRes, 1, 1) == ")")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Konqueror")+10,1); if ((MySafeSubstring(getVersionRes, 3, 1) == ";") || (MySafeSubstring(getVersionRes, 3, 1) == ")")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Konqueror")+10,3); }; if (userAgent.Contains("Opera")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Opera")+6,4); if (userAgent.Contains("Safari")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Safari")+7,5); if (userAgent.Contains("Lotus-Notes")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Lotus-Notes")+12,3); if (userAgent.Contains("Lynx")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Lynx")+5,5); if (userAgent.Contains("Netscape") || userAgent.Contains("Nav")) getVersionRes = MySafeSubstring(userAgent.IndexOf("Netscape")+5,5); return getVersionRes; } } public String getOS { get { String getOSRes = "???"; if (userAgent.Contains("Win")) { getOSRes = "win"; } else if (userAgent.Contains("Mac")) { getOSRes = "mac"; } else if (userAgent.Contains("Linux")) { getOSRes = "lnx"; } else if (userAgent.Contains("Unix")) { getOSRes = "unx"; } else if (userAgent.Contains("SunOS")) { getOSRes = "sol"; } else if (userAgent.Contains("FreeBSD")) { getOSRes = "bsd"; }; return getOSRes; } } public String getFullOS { get { String getFullOSRes = "Unknown"; if (userAgent.Contains("Win")) { getFullOSRes = "Windows"; } else if (userAgent.Contains("Mac")) { getFullOSRes = "Macintosh"; } else if (userAgent.Contains("Linux")) { getFullOSRes = "Linux"; } else if (userAgent.Contains("Unix")) { getFullOSRes = "Unix"; } else if (userAgent.Contains("SunOS")) { getFullOSRes = "Sun Solaris"; } else if (userAgent.Contains("FreeBSD")) { getFullOSRes = "FreeBSD"; }; return getFullOSRes; } } private int SafeStartInd(int strLength, int IndOf) { if (IndOf < 0) return ((int)0); if (IndOf > (strLength - 1)) return (strLength - 1); return IndOf; } private int SafeLeng(int strLength, int IndOf, int SubLeng) { if (SubLeng < 0) return (SubLeng + LastIndDiff); return SubLeng; } private String MySafeSubstring(String inputStr, int startIndex, int length) { int newStartIndex = this.SafeStartInd(inputStr.Length, startIndex); int newLength = this.SafeLeng(inputStr.Length, newStartIndex, length); return (inputStr.Substring(newStartIndex, newLength)); } private String MySafeSubstring(int startIndex, int length) { return (this.MySafeSubstring(this.userAgent, startIndex, length)); } // Автор: Antikvarnt }И при чём тут Java?
А что это не java написано???
(javascript != java)
Andy, написано на Java, но тема про JS :)