gerhard: Testen ob IE 6

Hi,

wie kann ich mit Javascript in einer if-Schleife testen, ob der Browser = IE 6 ist?

Danke

  1. Hi,

    wie kann ich mit Javascript in einer if-Schleife testen, ob der Browser = IE 6 ist?

    Es gibt keine "If-Schleifen".

    Und zu fragen, ob ein Browser ein bestimmter Browser ist, ist oft weniger sinnvoll, als bei den Sachen, die per Script gemacht werden sollen, abzufragen, ob der Browser sie beherrscht.
    Also beschreibe doch bitte mal genauer, was du *erreichen* willst.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hallo,

      Und zu fragen, ob ein Browser ein bestimmter Browser ist, ist oft weniger sinnvoll, als bei den Sachen, die per Script gemacht werden sollen, abzufragen, ob der Browser sie beherrscht.

      mit anderen Worten: Frage einen Browser nicht, wie er heißt, sondern ob er die Methode/die Eigenschaft kennt, die du verwenden möchtest.

      Ciao,
       Martin

      --
      Programmierer (m), seltener auch ~in (w):
      Irdische, i.a. humanoide Lebensform, die in einem komplizierten biochemischen Prozess Kaffee, Cola und Pizza in maschinenlesbaren Programmcode umwandelt.
      P~ bilden gelegentlich mit ihresgleichen kleine Gruppen, sogenannte Communities, sind aber ansonsten meist scheue Einzelgänger.
      P~ sind vorwiegend nachtaktiv und ohne technische Hilfsmittel nur eingeschränkt lebensfähig.
    2. Also beschreibe doch bitte mal genauer, was du *erreichen* willst.

      Da der IE6 kein :hover in CSS beherscht, will ich es mit Javascript per

      document.getElementById('xyx').onmouseover = "";

      verteilen, aber eben nur, wenn der Browser IE 6 ist.

      1. Hi,

        Da der IE6 kein :hover in CSS beherscht, will ich es mit Javascript per [...] verteilen, aber eben nur, wenn der Browser IE 6 ist.

        Da boeten sich dann vielleicht eher Conditional Comments zur Einbindung des Scriptes an.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Da der IE6 kein :hover in CSS beherscht, will ich es mit Javascript per [...] verteilen, aber eben nur, wenn der Browser IE 6 ist.

          Da boeten sich dann vielleicht eher Conditional Comments zur Einbindung des Scriptes an.

          Du meinst conditional compilation oder die Bedingte Kompilierung wie es M$ nennt: http://msdn.microsoft.com/de-de/library/ahx1z4fs.aspx

          Struppi.

          1. Hi,

            Da boeten sich dann vielleicht eher Conditional Comments zur Einbindung des Scriptes an.

            Du meinst conditional compilation oder die Bedingte Kompilierung wie es M$ nennt: http://msdn.microsoft.com/de-de/library/ahx1z4fs.aspx

            Nein, meinte ich nicht - denn da sehe ich keine Moeglichkeit, ueber die verfuegbaren Variablen die Browserversion abzufragen, so wie Conditional Comments im HTML das bieten.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Du meinst conditional compilation oder die Bedingte Kompilierung wie es M$ nennt: http://msdn.microsoft.com/de-de/library/ahx1z4fs.aspx

              Nein, meinte ich nicht - denn da sehe ich keine Moeglichkeit, ueber die verfuegbaren Variablen die Browserversion abzufragen, so wie Conditional Comments im HTML das bieten.

              Ist @_jscript_version dafür nicht geeignet?

              Struppi.

              1. Hi,

                Nein, meinte ich nicht - denn da sehe ich keine Moeglichkeit, ueber die verfuegbaren Variablen die Browserversion abzufragen, so wie Conditional Comments im HTML das bieten.

                Ist @_jscript_version dafür nicht geeignet?

                Ich weiss nicht, in wie fern die Version der JScript-Engine Rueckschluesse auf die Browserversion zulaesst. (Irgendwer hier im Forum hatte das IIRC mal untersucht - aber ich weiss auch nicht mehr, ob das Ergebnis eine eindeutige Zuordnung erlaubte.)

                MfG ChrisB

                --
                „This is the author's opinion, not necessarily that of Starbucks.“
                1. [latex]Mae  govannen![/latex]

                  Ist @_jscript_version dafür nicht geeignet?

                  Ich weiss nicht, in wie fern die Version der JScript-Engine Rueckschluesse auf die Browserversion zulaesst. (Irgendwer hier im Forum hatte das IIRC mal untersucht - aber ich weiss auch nicht mehr, ob das Ergebnis eine eindeutige Zuordnung erlaubte.)

                  http://forum.de.selfhtml.org/archiv/2008/10/t178652/#m1178442

                  Cü,

                  Kai

                  --
                  Ash nazg durbatulûk, ash nazg gimbatul,ash nazg thrakatulûk, agh burzum-ishi krimpatul
                  selfcode sh:( fo:| ch:? rl:( br:< n4:# ie:{ mo:| va:) js:) de:> zu:) fl:( ss:| ls:?
      2. Hi,

        Da der IE6 kein :hover in CSS beherscht, will ich es mit Javascript per

        document.getElementById('xyx').onmouseover = "";

        verteilen, aber eben nur, wenn der Browser IE 6 ist.

        Dafür gibt es im Web fertige Lösungen, die auf Behaviors beruhen.

        Alternativ: man kann via styleSheets-Collection und, beim IE, dann via rules-Collection auf die Stylesheets und seine Regeln zugreifen. Bei unbekannten Regeln liefert der IE ein "UNKOWN" (o.s.ä). Ob das hier auch klappt, habe ich allerdings nicht getestet.*) Schließlich ist :hover dem IE nicht generell unbekannt, sondern nur partiell ...

        *) mit cssRule() sollte man das aber schnell mal testen können.

        Gruß, Cybaer

        --
        Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
        (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
      3. Da der IE6 kein :hover in CSS beherscht, will ich es mit Javascript per

        document.getElementById('xyx').onmouseover = "";

        verteilen, aber eben nur, wenn der Browser IE 6 ist.

        Eine Browserweiche ist hier schlicht unnötig, man kann via JavaScript einfach eine Klasse beim Mouserover hinzufügen, sodass die Styles trotzdem wirken:

        #bereich li:hover, #bereich li.highlight { ... }

        var toggleClass = function () { $(this).toggleClass("highlight"); }:
        $("#bereich li").bind("mouseenter", toggleClass).bind("mouseleave", toggleClass);

        (jQuery-Beispiel)

        Aus Performance-Gründen kann man das natürlich nicht optimal finden, aber soviel macht das wahrlich nicht aus. Man kann es ja mit einer einfachen IE-Weiche (Conditional Compilation) kombinieren, dann ist es halt im IE 7 doppelt gemoppelt, was auch nicht schadet.

        Mathias

        1. Hi,

          Aus Performance-Gründen kann man das natürlich nicht optimal finden, aber soviel macht das wahrlich nicht aus.

          Hmm, bist Du der gleiche "molily", der sich früher bei Verwendung von getElementsByTagName("*") darüber aufgeregt hat, weil das so inperformant sei?

          SCNR - ich teile ja deine heutige Auffassung.

          Gruß, Cybaer

          --
          Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
          (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
          1. Hmm, bist Du der gleiche "molily", der sich früher bei Verwendung von getElementsByTagName("*") darüber aufgeregt hat, weil das so inperformant sei?

            Keine Ahnung, kommt ohnehin darauf an, für welchen Zweck das benötigt wird.
            Für die Hover-Sache sehe ich keine bessere Alternative, aber ich hätte auch nichts gegen Conditional Compilation bzw. eine navigator-Abfrage für die Version. Wenn die aus irgendwelchen Gründen nicht klappt, ist es auch egal, wenn es bloß um Hover-Effekt geht, und wenn sie false positives produziert, ist es nicht schlimm. Wenn es mehr wird, kann man mit Conditional Comments ein eigenes Script für IE 6 einbinden, schließlich wird der Fix in anderen Browsern nicht benötigt.

            Mathias

  2. Hallo! IE6 kann man mit

    if (document.all && !window.opera && !window.XMLHttpRequest) { ... }

    erfragen. Allerdings ist das nicht unbedingt der Weisheit letzter Schluß. Besser ist es, wie ChrisB schreibt, nach den Fähigkeiten zu suchen.

    Gruß, LX

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
  3. Habe eine Lösung gefunden:

    if (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 6.0") != -1) { /* IE 6 */ }

    1. Hi,

      Habe eine Lösung gefunden:

      das ist keine Lösung.

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Hi,

        das ist keine Lösung.

        Zwecks Wissensgewinn: Wie fälscht man appName und appVersion bei den gängigen Browsern?

        Da ich das nicht weiß, halte auch ich das, ggf. in Verbindung mit Conditional Compilation,  für *eine* Möglichkeit.

        Gruß, Cybaer

        --
        Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
        (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
        1. Zwecks Wissensgewinn: Wie fälscht man appName und appVersion bei den gängigen Browsern?

          Opera kann es imho per default, für Firefox (in about:config habe ich keine Einstellung dafür gefunden) gibt es User Agent Switcher, habe es gerade getestet, richtig eingestellt, würde der von gerhard vorgestellte Test meinen Firefox als IE 6 erkennen.

          --
          Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
          Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
          1. Hi,

            Opera kann es imho per default, für Firefox (in about:config habe ich keine Einstellung dafür gefunden) gibt es User Agent Switcher,

            Verwechsel *nicht* userAgent mit appName, appCodeName & appVersion!

            AFAIK kann man i.d.R. den userAgent frei bestimmen - ggf. bietet der Client vordefinierte an.

            Ich kenne zumindest keinen Fall, wo man die Systemkennung selbst ändern kann (ohne im Programmcode selbst rumzupfuschen versteht sich). Und ich kann mir auch nicht vorstellen, wie und warum der Browser eine (beliebige) UA-Kennung umwandelt in gültige Werte für die Systemkennung.

            Gruß, Cybaer

            --
            Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
            (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
            1. Verwechsel *nicht* userAgent mit appName, appCodeName & appVersion!

              Ach, und wo kommen die her?

              Ich kenne zumindest keinen Fall, wo man die Systemkennung selbst ändern kann (ohne im Programmcode selbst rumzupfuschen versteht sich). Und ich kann mir auch nicht vorstellen, wie und warum der Browser eine (beliebige) UA-Kennung umwandelt in gültige Werte für die Systemkennung.

              Dann kennst du jetzt einen. Wenn ich mir appName, appCodeName und appVersion ausgeben lasse, dann via User Agent Switcher einen anderen User Agent String einstelle und mir appName, appCodeName und appVersion dann anzeigen lasse, entsprechen sie dem, was im User Agent String steht. Übrigens ist dazu nichtmal ein Seiten-Reload nötig.

              --
              Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
              Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
              1. Hi,

                Dann kennst du jetzt einen. Wenn ich mir appName, appCodeName und appVersion ausgeben lasse, dann via User Agent Switcher einen anderen User Agent String einstelle und mir appName, appCodeName und appVersion dann anzeigen lasse, entsprechen sie dem, was im User Agent String steht. Übrigens ist dazu nichtmal ein Seiten-Reload nötig.

                Whow, cool. Danke - das probiere ich aus.

                Gruß, Cybaer

                --
                Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
                (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
                1. Dann kennst du jetzt einen. Wenn ich mir appName, appCodeName und appVersion ausgeben lasse, dann via User Agent Switcher einen anderen User Agent String einstelle und mir appName, appCodeName und appVersion dann anzeigen lasse, entsprechen sie dem, was im User Agent String steht. Übrigens ist dazu nichtmal ein Seiten-Reload nötig.
                  Whow, cool. Danke - das probiere ich aus.

                  Übrigens machen Safari für Windows und Opera das beide auch (von Haus aus sogar!), ist also das übliche Verhalten, wenn man den User Agent String ändert. ;-)

                  --
                  Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                  Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
                  1. Hi,

                    Übrigens machen Safari für Windows und Opera das beide auch (von Haus aus sogar!), ist also das übliche Verhalten, wenn man den User Agent String ändert. ;-)

                    Bin noch nicht dazu gekomen, es auszuprobieren (mache ich gleich noch), aber das wage ich nach wie vor zu Bezweifeln. Ich kann mir einfach nicht vorstellen, daß der selbstdefinierte UA-String "auseinandergenommen" wird. Will heißen: Wenn Safari & Opera anbieten, ihre "Identität" zu "verschleiern", dann werden sie wohl deswegen appName/appVersion ändern *und* den UA-String (gleichwohl: Opera bleibt trotzdem erkennbar, da sich window.opera, laut Opera-Doku, dennoch nicht ändert). Wäre beim Safari analog die Frage, was bei vendor, vendorSub bzw. product eingetragen wird (ich tippe mal einfach: der Safari wird hier dennoch erkennbar bleiben).

                    Nun, wir werden sehen ...

                    Gruß, Cybaer

                    --
                    Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
                    (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)
                    1. Bin noch nicht dazu gekomen, es auszuprobieren (mache ich gleich noch), aber das wage ich nach wie vor zu Bezweifeln. Ich kann mir einfach nicht vorstellen, daß der selbstdefinierte UA-String "auseinandergenommen" wird.

                      Zumindest bei der Firefox-Erweiterung ist es tatsächlich genau umgekehrt: Man kann dort appName, appVersion, etc. eintragen und er baut daraus den UA-String zusammen. Beim Safari hingegen kann man einen String angeben, der wird dann zerlegt, gerade getestet.
                      Im Prinzip ist es aber auch egal, wie nun genau die Änderungen von navigator.* vonstatten gehen, Fakt ist, sie sind da und somit ist das keine zuverlässige Methode, einen Browser zu erkennen.

                      Will heißen: Wenn Safari & Opera anbieten, ihre "Identität" zu "verschleiern", dann werden sie wohl deswegen appName/appVersion ändern *und* den UA-String (gleichwohl: Opera bleibt trotzdem erkennbar, da sich window.opera, laut Opera-Doku, dennoch nicht ändert). Wäre beim Safari analog die Frage, was bei vendor, vendorSub bzw. product eingetragen wird (ich tippe mal einfach: der Safari wird hier dennoch erkennbar bleiben).

                      Die von mir genannte Firefox-Erweiterung bietet gleichzeitig an, auch den navigator.vendor bzw. bzw. navigator.vendorSub zu ändern.

                      --
                      Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                      Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
                      1. Hi,

                        Zumindest bei der Firefox-Erweiterung ist es tatsächlich genau umgekehrt: Man kann dort appName, appVersion, etc. eintragen und er baut daraus den UA-String zusammen.

                        Die kannte ich noch nicht.

                        Aber: Man kann nicht product und productSub verändern! D.h., das "Gecko" in product bleibt (ebenso wie das Vorhandensein der Eigenschaft selbst) erhalten. Perfekt maskieren kann man den Browser damit nicht. Und bei meiner eigenen Browser-Detection wird ein als IE maskierter FF dennoch nur als IE erkannt (da ich generell für IE>=4 Conditional Compilation voraussetze). Auch bei Opera ./. Fake-Opera greift nach wie vor die Prüfung auf window.opera.

                        Dennoch bleibt meine ursprüngliche Aussage, daß diese Abfrage, ggf. in Verbindung mit CC, *eine* Möglichkeit zur Feststellung sei, nicht bestehen. Denn auch beim IE wird appVersion neu gesetzt, wenn man via Registry einen anderen IE vorgaukelt. Ein Test mittels Conditional Comments funktioniert dann aber ggf. natürlich auch nicht mehr, da man den Version Vector ja ebenfalls in der Registry ändern kann ...

                        Beim Safari hingegen kann man einen String angeben, der wird dann zerlegt, gerade getestet.

                        Kann ich nicht bestätigen. Er übernimmt den UA einfach nach appVersion (wobei ein ggf. das führendes "Mozilla/" entfernt wird), aber appName und der Rest bleiben unangetastet. Der einzige Wert, der ihn als Safari ausweist, ist sowieso der vendor-Wert (sofern man Chrome bereits ausgeschlossen hat). Und auch der bleibt unangetastet.

                        Fazit:

                        Man kann die IEs & Operas (sofern nicht uralt) *immer* vom Rest unterscheiden. Aber man kann nicht die tatsächliche Version sicher auslesen. Dazu müßte man auf Eigenschaften (JS und/oder CSS) prüfen, die die jeweiligen Versionen haben - oder eben auch nicht.

                        Den Rest der gängigen Browser kann man ggf. mit dem FF und der Extension faken (oder vermutlich auch, indem man die Änderungen im jeweiligen Mozilla manuell einträgt) - sofern man dazu nicht product oder productSub benötigt. Aber zumindest Safari & Chrome tarnen sich hier ohnehin als "Gecko", und die offizielle kennung des Konquerors, "KDE" in vendor, läßt sich faken.

                        Gruß, Cybaer

                        --
                        Man muß viel gelernt haben, um über das, was man nicht weiß, fragen zu können.
                        (Jean-Jacques Rousseau, Philosoph u. Schriftsteller)