<rmcreative>

RSS

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

  1. №412
    Евгений
    Евгений 07.07.2008, 18:04:27

    Код определения браузера в jQuery невероятно глючный. Что неудивительно учитывая такие user-agent, к тому же сторонние приложения вносят свою лепту user-agent, к примеру, раньше был баг когда наличие Mail.Ru Agent путалось с Opera, насколько я помню там в регулярке было /ra/ (сократили объем кода типа :)

  2. №413
    Sam
    Sam 07.07.2008, 18:12:41

    Оно, кажется, там и сейчас есть…

  3. №414
    Octane
    Octane 07.07.2008, 22:09:15

    Для определения версии IE обычно использую условные комментарии:

    var ie = 0/*@cc_on+@_jscript_version*10@*/;

    в результате вычисления этого нехитрого выражения в переменной ie будет лежать номер версии IE начиная с 5 (IE5.5), правда IE8b определяется как IE7, но это пока что не актуально. В случае использования нормального браузера, переменная ie равна 0. Идею взял отсюда.

  4. №415
    Octane
    Octane 07.07.2008, 22:12:49

    Блин, при постинге код порезало, там еще после умножения на 10 вычисляется остаток от деления на 10

  5. №980
    AlexNT
    AlexNT 18.12.2008, 20:01:26
    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
    
        }
    
  6. №981
    Sam
    Sam 18.12.2008, 20:03:26

    И при чём тут Java?

  7. №3854
    Andy
    Andy 03.02.2011, 22:06:28

    А что это не java написано???

    (javascript != java)

  8. №3856
    Sam
    Sam 04.02.2011, 12:07:40

    Andy, написано на Java, но тема про JS :)

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.