COLOSSUS: navigator.appVersion vom Betriebssystem abhängig?

Hallo zusammen.

Ich habe in meinem Javascript eine simple Browser-Weiche eingebaut:

  
if (navigator.appVersion.indexOf("MSIE 8.0") > -1)  
{  
   this.isIE8 = true;  
}  
else  
{  
    this.isIE8 = false;  
}

So weit, so gut. Das ganze steckt in einem WAR-Archiv als Webapplikation.

Wenn ich diese Applikation auf meinem eigenen PC ausführe (Win XP, 64bit), dann funktioniert die Weiche auch.

Wenn ich mit meinem IE8 die Seite aufrufe, kommt für "navigator.appVersion" als Antwort:

============
4.0 (compatible; MSIE 8.0; Windows NT 5.2; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

Spiele ich die WAR-Datei auf einen anderen Server (Windows Server 2008, 64bit) und surfe dort dann die Seite mit dem gleichen(!) IE8 an, kommt als Antwort:

============
4.0 (compatible; MSIE 7.0; Windows NT 5.2; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

Spiele ich die WAR-Datei auf einem Windows Server 2003 auf und rufe die Seite auch wieder mit dem gleichen IE8 an, kommt wieder die erste Ausgabe.

Problem: Warum wird mein Internet Explorer 8 mal als "MSIE 7.0" und mal als "MSIE 8.0" erkannt? Obwohl Applikation/Quellcode/Browser gleich sind?

Apache und Tomcat-Versionen sind auch überall identisch. Der für mich einzige noch offensichtliche Unterschied liegt im Betriebssystem.

Frage: Wie kann man das umgehen? :)

navigator.userAgent hilft genauso wenig als wenn ich den Parameter "User-Agent" aus dem HttpServletRequest auslese.

Gibt es vielleicht eine Javascript-Funktion, die erst ab dem IE8 interpretiert wird? Dann könnte ich über diesen Umweg eventuell die Browser-Weiche legen.

Wobei: Wenn der meinen Browser eh bereits als "MSIE 7.0" erkennt, würde er wohl dann auch die IE8-JS-Funktion ignorieren.

Sehr komische Sache, das.

Danke für Tipps.

COLOSSUS

  1. Ich habe in meinem Javascript eine simple Browser-Weiche eingebaut:

    Ich sollte noch dazu sagen, dass mir diese Weiche einfach nur sagen soll, ob die Seite von einem IE8 oder einem früheren IE aufgerufen wird.

    1. Hallo,

      Ich habe in meinem Javascript eine simple Browser-Weiche eingebaut:
      Ich sollte noch dazu sagen, dass mir diese Weiche einfach nur sagen soll, ob die Seite von einem IE8 oder einem früheren IE aufgerufen wird.

      schon mal an die Verwendung von Conditional Comments gedacht?

      Freundliche Grüße

      VM

    2. Hi,

      Ich sollte noch dazu sagen, dass mir diese Weiche einfach nur sagen soll, ob die Seite von einem IE8 oder einem früheren IE aufgerufen wird.

      Simpel, da der IE8 entsprechende sichere Infos zur Verfügung stellt, ältere IEs hingegen nicht:

      http://aktuell.de.selfhtml.org/weblog/kompatibilitaetsmodus-im-internet-explorer-8

      Gruß, Cybaer

      --
      Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
      (Joseph Joubert, Schriftsteller)
  2. Mahlzeit COLOSSUS,

    So weit, so gut.

    So weit, so schlecht. Browserweichen (bzw. allgemeiner Browsererkennungen), die sich auf beliebig manipulier- und fälschbare Informationen (in diesem Fall die HTTP_USER_AGENT-Kennung des Browsers) verlassen, sind allesamt Müll. Diese Kennung ist vom Programmierer des Browsers, teilweise sogar von dessen Benutzer beliebig festlegbar und besitzt daher 0 (in Worten: NULL) Aussagekraft.

    Problem: Warum wird mein Internet Explorer 8 mal als "MSIE 7.0" und mal als "MSIE 8.0" erkannt? Obwohl Applikation/Quellcode/Browser gleich sind?

    Herzlichen Glückwunsch - Du hast soeben die Sinnlosigkeit einer derartigen Browserweiche anschaulich vor Augen geführt.

    Verlasse Dich bei der Erkennung eines bestimten Browsers (bzw. einer bestimmten Version eines bestimmten Browsers) auf die Fähigkeiten, die dieser spezielle Browser hat.

    In Deinem Fall würde ich einen Test auf das Vorhandensein der Kombination von "window.navigator.systemLanguage" auf der einen und "window.postMessage" oder "document.querySelectorAll" auf der anderen Seite vorschlagen.

    http://www.lipfert-malik.de/webdesign/tutorial/bsp/browser_js_test.html

    Gibt es vielleicht eine Javascript-Funktion, die erst ab dem IE8 interpretiert wird? Dann könnte ich über diesen Umweg eventuell die Browser-Weiche legen.

    Das solltest Du in jedem Fall tun (s.o.).

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo nochmal.

      So, Wochenende ist vorüber - nun konnte ich mich dem Problem wieder widmen.

      In Deinem Fall würde ich einen Test auf das Vorhandensein der Kombination von "window.navigator.systemLanguage" auf der einen und "window.postMessage" oder "document.querySelectorAll" auf der anderen Seite vorschlagen.

      Ja, sehr schön, vielen Dank dafür. Funktioniert gut:

          if (window.navigator.systemLanguage)  
          {  
              this.isIE = true;  
        
              if (window.postMessage)  
              {  
                  this.isIE8 = true;  
          }  
          else  
          {  
                  this.isIE8 = false;  
              }  
          }  
          else  
          {  
              this.isIE = false;  
              this.isIE8 = false;  
          }
      

      Vielen Dank an alle für ihre Nachrichten. :)

      Grüße und schöne Feiertage

      COLOSSUS

  3. hi,

    Problem: Warum wird mein Internet Explorer 8 mal als "MSIE 7.0" und mal als "MSIE 8.0" erkannt? Obwohl Applikation/Quellcode/Browser gleich sind?

    weil die Entwickler im IE8 einen Modus eingebaut haben, der Seiten wie IE7 darstellt. Sie hatten zu viel Angst vor den ganzen IE-Css-Hacks, die IE8 nicht mehr braucht aber möglicherweise doch interpretiert.

    Ansonsten wurde ja bereits erwähnt, dass es besser ist, Fähigkeiten zu prüfen.

    Gruesse, Joachim

    --
    Am Ende wird alles gut.