2008-10-16 6 views
14

Ich bin es gewohnt, Atlas zu verwenden. Vor kurzem habe ich angefangen, zu jQuery und manchmal Prototyp zu übergehen. Das Projekt, an dem ich gerade arbeite, verwendet einen Prototyp.Browser und Version in der Prototypbibliothek?

In Prototype gibt es eine einfache Möglichkeit, den Browser-Namen und die Version zu erhalten? Ich habe mir die API-Dokumentation angesehen und kann sie nicht finden.

+0

Und so nebenbei, verstehe ich die Tücke der Codierung zu einem bestimmten Browser und deren Version, wie die Codierung gegenüber der verfügbaren ‚Features‘ gegenüber. – EvilSyn

+0

Mehr scheuern, und ich sehe Prototyp.Browser, die mir Boolean auf IE oder Gecko usw. geben wird. Das hilft also .. Wäre schön, wenn es die Version auch drin hätte, aber ich denke, ich kann einfach altes JS dafür schreiben . – EvilSyn

Antwort

3

Sie haben recht - Prototyp bietet kein Dienstprogramm zur Ermittlung des Browsernamens oder der Browserversion.

Wenn Sie speziell benötigen Sie den Browser Info als Plugin zu bekommen, würde ich vorschlagen, das Hinzufügen von folgenden (aus direkt jQuery genommen):

var Browser = Class.create({ 
    initialize: function() { 
    var userAgent = navigator.userAgent.toLowerCase(); 
    this.version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1]; 
    this.webkit = /webkit/.test(userAgent); 
    this.opera = /opera/.test(userAgent); 
    this.msie = /msie/.test(userAgent) && !/opera/.test(userAgent); 
    this.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent); 
    } 
}); 
+2

Sie sind etwas falsch, Prototype bietet ein Dienstprogramm zum Erraten des Browsernamens, wie ich unten zeige. Und das Erraten ist wirklich das Beste, was Sie tun können, da jeder Browser über seine User-Agent-Zeichenfolge lügen kann. – nertzy

+0

Dies ist eine großartige Lösung, danke.(Es funktioniert besser als das von Prototype, das nur zwischen IE, Opera, WebKit, MobileSafari und Gecko unterscheidet - und ohne Versionsnummern, ohne es selbst zu codieren.) –

+0

Die Zeile hinzufügen: this.chrome = /chrome/.test (userAgent) ; fügt Anerkennung für ... Sie haben es erraten. (Hinweis: Sie müssen der Zeile "Safari" auch "&&! /chrome/.test (userAgent);" hinzufügen.) –

7

Prototyp bietet einige Fahnen können Sie überprüfen, um eine Vorstellung zu bekommen welcher Browser gerade läuft. Denken Sie daran, dass es viel besser ist, nach der Funktionalität zu suchen, die Sie verwenden möchten, als nach einem bestimmten Browser zu suchen.

Hier ist der browser- und feature-Erfassungsabschnitt von prototype.js derzeit im Quellbaum:

var Prototype = { 
    Browser: { 
    IE:  !!(window.attachEvent && 
     navigator.userAgent.indexOf('Opera') === -1), 
    Opera: navigator.userAgent.indexOf('Opera') > -1, 
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, 
    Gecko: navigator.userAgent.indexOf('Gecko') > -1 && 
     navigator.userAgent.indexOf('KHTML') === -1, 
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) 
    }, 

    BrowserFeatures: { 
    XPath: !!document.evaluate, 
    SelectorsAPI: !!document.querySelector, 
    ElementExtensions: !!window.HTMLElement, 
    SpecificElementExtensions: 
     document.createElement('div')['__proto__'] && 
     document.createElement('div')['__proto__'] !== 
     document.createElement('form')['__proto__'] 
    }, 
} 

Sie könnten also prüfen, ob der aktuelle Browser IE ist, den Wert von Prototype.Browser.IE durch die Untersuchung oder alternativ sein zukunftssicherer und prüfen Sie auf eine bestimmte Funktion wie XPath mit Prototype.BrowserFeatures.XPath.

18

Als Ergänzung zu nertzy Antwort haben Sie die Möglichkeit zur Erkennung IE-Versionen hinzufügen, können dies mit:

Prototype.Browser.IE6 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 6; 
Prototype.Browser.IE7 = Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 7; 
Prototype.Browser.IE8 = Prototype.Browser.IE && !Prototype.Browser.IE6 && !Prototype.Browser.IE7; 

Auf der anderen Seite auch Sie müssen User-Agent-Details auf der Serverseite erkennen. Anyways Browser-Erkennung ist eine ernsthaft fehlerhafte Strategie zum Schreiben von Cross-Browser-Skripten, die nur verwendet werden soll, wenn die Erkennung von Browser-Funktionen fehlschlägt. Es ist ziemlich einfach für einen Benutzer, seine Benutzeragenten-Details zu ändern.

+0

Bitte beachten Sie, dass diese Antwort nicht für den IE9 zuständig ist (da er wahrscheinlich noch nicht existiert) als es veröffentlicht wurde). –

+0

Meine Vermutung ist, dass weniger als 10% der Benutzer nicht wissen, wie man ihren User Agent ändert, also denke ich, es ist keine schlechte Strategie –

+0

Die letzte Zeile muss für IE9 aktualisiert werden! Prototype.Browser.IE8 gibt True zurück, wenn die neueste Version des großartigen Browsers verwendet wird. – jmlnik

2

Ich habe prototype.js erweitert nach:

var Prototype = { ... }; 

mit diesem:

// extension 
if (Prototype.Browser.IE) { 
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { 
     Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1); 
    } 
} 

funktioniert gut für mich, Berufung ist wie:

if (Prototype.Browser.IE && Prototype.BrowserFeatures['Version'] == 8) { ... } 
3

ich so die Kontrolle über und oberhalb der Browserdefinitionen von Prototype.

Object.extend(Prototype.Browser, { 
    ie6: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 6 ? true : false) : false, 
    ie7: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 7 ? true : false) : false, 
    ie8: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 8 ? true : false) : false, 
    ie9: (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) ? (Number(RegExp.$1) == 9 ? true : false) : false 
}); 

Hoffe es hilft!

0
  <script type="text/JavaScript"> 

       function getBrowserVersion() 
       { 
        var msg = "Not Recognised Browser"; 

        if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) 
        { 
         var ffversion = new Number(RegExp.$1) 

         for (var i = 1; i < 20; i++) 
         { 
          if (ffversion == i) 
          { 
           msg = "FF" + i + "x"; 
           break; 
          } 
         } 
        } 
        else if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) 
        { 
         var ieversion = new Number(RegExp.$1) 

         for (var i = 1; i < 20; i++) 
         { 
          if (ieversion == i) 
          { 
           msg = "IE" + i + "x"; 
           break; 
          } 
         } 
        } 

        alert(msg); // return msg; 
       } 

      </script> 
+0

Code nur Antworten sind nicht gut. Bitte erläutern Sie die Antwort zusammen mit Ihrem Code. –

Verwandte Themen