Jürgen Berkemeier: DOM und Browserabfrage

Hallo,

vor dem Einsatz des DOM frage ich ab, ob der Browser DOM unterstützt:

kannDOM = document.getElementById && !window.opera ;

Hierdurch wird Opera grundsätzlich ausgeschlossen (z.Zt. kann Opera Objekte nur lesen, nicht aber ändern). Gibt es eine Möglichkeit, den Test so zu gestalten, dass ein spezieller Browser nicht explizit ausgeschlossen wird? Vieleicht unterstützt Opera ja irgendwann einmal das DOM vollständig und dann muss ich alle Seiten anpassen. Der Test müsste also prüfen, ob es bestimme Objekte und Methoden gibt und mit ihnen Teile der Seite verändert werden können (nach Möglichkeit, ohne dies zu tun).

Viele Grüße,     Jürgen

  1. Hallo,

    Gibt es eine Möglichkeit, den Test so zu gestalten, dass ein spezieller Browser nicht explizit ausgeschlossen wird?

    Ja, Du gibst explizit an, dass er "mitmachen" darf. ;)

    »»Vieleicht unterstützt Opera ja irgendwann einmal das DOM vollständig und dann muss ich alle Seiten anpassen. Der Test müsste also prüfen, ob es bestimme Objekte und Methoden gibt und mit ihnen Teile der Seite verändert werden können (nach Möglichkeit, ohne dies zu tun).

    Du könntest z.B. mit dem Event-Handler "onError" abfragen, ob es zu einem Fehler kommt, wenn Du bestimmte Tests durchführst und erst dann das eigentliche Script starten, wenn es keine Fehler gab. Dies müßte eigentlich ein recht sicherer Weg sein. Was allerdings wesentlich einfacher zu realsisieren ist, einfach die Version des Browsers abzufragen. Meist wird erst in neueren Versionen ein Feature verfügbar, so dass Du alle älteren Browser "rausschmeissen" kannst. Ein Test um die Version zu ermitteln ist das navigator.appVersion-Objekt.

    Viele Grüße...

    Alex :)

    Viele Grüße,     Jürgen

    1. hi

      Was allerdings wesentlich einfacher zu realsisieren ist, einfach die Version des Browsers abzufragen. Meist wird erst in neueren Versionen ein Feature verfügbar, so dass Du alle älteren Browser "rausschmeissen" kannst. Ein Test um die Version zu ermitteln ist das navigator.appVersion-Objekt.

      navigator.irgendwas kann man im Zeitalter von gefakten Browser-IDs immer mehr vergessen.

      Grüße aus Bleckede

      Kai

      1. navigator.irgendwas kann man im Zeitalter von gefakten Browser-IDs immer mehr vergessen.

        Ausser navigator.userAgent Hier wird auch bei Opera eine HTTP-Kennung geschickt die den Opera mitsamt Version kennzeichnet. Auch wenn man MSIE oder was anderes eingestellt hat.

        Ganz praktisch:

        op = /opera.6/g.test(navigator.userAgent.toLowerCase()) ? 1:0;

        1. hi

          Ausser navigator.userAgent Hier wird auch bei Opera eine HTTP-Kennung geschickt die den Opera mitsamt Version kennzeichnet. Auch wenn man MSIE oder was anderes eingestellt hat.

          Ganz praktisch:

          op = /opera.6/g.test(navigator.userAgent.toLowerCase()) ? 1:0;

          gerade dieer Kennung würde ich _überhaupt_ nicht trauen. Dank irgendweicher Proxy-Server kann da eigentlich alles stehen, bis hin zu völlig wirren Texten, aber auch exakt abgetippte ID-Strings anderer Browser.

          Grüße aus Bleckede

          Kai

          1. Proxy-Server

            Dürfte das nicht egal sein wenn es um Javascript geht? Kenn mich mit Proxys net so aus.

            Gruß Herbalizer

            1. Hi,

              Proxy-Server

              Dürfte das nicht egal sein wenn es um Javascript geht? Kenn mich mit Proxys net so aus.

              Ja, das ist richtig. Denn JS läuft Clientseitg. Da hat der Proxy kein Wort mitzureden. Es ist jedoch möglich, bei einigen Browser den Useragent "frei" festzulegen. Da bringt eine solche Abfrage natürlich nichts. Eine Abfrage der Fähigkeiten, die ein Browser besitzt, ist in der Tat die beste Möglichkeit. Denn wer weiß, vielleicht kommt es ja irgendwann einmal soweit, daß man die Scriptfähigkeiten der Browser selbst einstellen kann. Mozilla macht es "im kleinen" ja bereits vor, indem man z.B. selbsttätig öffende Fenster unterbinden kann.

              Viele Grüße...

              Alex :)

              1. Ja, das ist richtig. Denn JS läuft Clientseitg. Da hat der Proxy kein Wort mitzureden. Es ist jedoch möglich, bei einigen Browser den Useragent "frei" festzulegen. Da bringt eine solche Abfrage natürlich nichts. Eine Abfrage der Fähigkeiten, die ein Browser besitzt, ist in der Tat die beste Möglichkeit. Denn wer weiß, vielleicht kommt es ja irgendwann einmal soweit, daß man die Scriptfähigkeiten der Browser selbst einstellen kann. Mozilla macht es "im kleinen" ja bereits vor, indem man z.B. selbsttätig öffende Fenster unterbinden kann.

                Dennoch wird ein solcher Browser (hoffentlich) weiterhin die Objekte und Methoden kennen. Im übrigen wird die mehrzahl der Nutzer ihren Borwser nicht patchen.
                Zumal man zB. beim Konqueror einfach nicht auf die browsereigene Auskunft verzichten kann, da er sehr viele DOM-Sachen unterstützt, dies bei einigen Sachen aber gnadenlos gegen den Baum geht (inkl. Absturz).

            2. Moin!

              Proxy-Server

              Dürfte das nicht egal sein wenn es um Javascript geht? Kenn mich mit Proxys net so aus.

              Wohl wahr.

              Allerdings: Ich hab' mir mal einen Opera gepatcht, der sich danach dann sowohl gegenüber dem Server als auch gegenüber jedem Javascript als waschechter IE 5 ausgegeben hat.

              Deshalb: Wenn man gewisse Javascript-Methoden und -Eigenschaften benutzen will, sollte man vorher prüfen, ob sie existieren. Aufgrund eines beliebig variablen User-Agents darauf zu schließen, was der Browser denn vermutlich können und kennen muß, ist der falsche Weg.

              Natürlich landet man dadurch im IF-Horror. Aber es gibt keine gute Alternative, wenn man Seiten schreiben will, die heute schon so gut wie möglich mit real existierenden Browsern funktionieren und gleichzeitig auch auf neue Versionen vorbereitet sind.

              - Sven Rautenberg

  2. hi

    kannDOM = document.getElementById && !window.opera ;

    Hierdurch wird Opera grundsätzlich ausgeschlossen (z.Zt. kann Opera Objekte nur lesen, nicht aber ändern). Gibt es eine Möglichkeit, den Test so zu gestalten, dass ein spezieller Browser nicht explizit ausgeschlossen wird?

    Da Opera 7 wohl DOM komplett können wird, macht das in der Tat Sinn...:)
    Ich weiß jetzt keinen konkreten Fall, aber es müsste gehen einfach nach einer DOM-Funktion zu suchen, die Opera eben nicht kennt...

    var newIFRAME = document.createElement("iframe");
    if(document.getElementById("bla").appendChild(newIFRAME)){alert("ja");}

    ..der 2zeiler Bringt zumindest mal in Mozilla und konqueror ein "ja", in Opera nicht.

    Grüße aus Bleckede

    Kai

    1. Hallo Kai,

      Danke für Deinen Tipp. Die Idee, zu Prüfen, ob "appendChild" möglich ist, ist wirklich gut, da sie die Seite nicht verändert!

      Danke auch an die anderen und viele Grüße,

      Jürgen

      1. Hallo Jürgen,

        vielleicht ist in diesem Zusammenhang (welche Funktion am sinnvollsten zur Browserabfrage verwendet werden kann) auch die 'DOM Compatibility Table' auf http://www.xs4all.nl/~ppk/js/index.html interessant.

        viele Grüße
        Karsten

    2. Hallo,

      var newIFRAME = document.createElement("iframe");
      if(document.getElementById("bla").appendChild(newIFRAME)){alert("ja");}

      ..der 2zeiler Bringt zumindest mal in Mozilla und konqueror ein "ja", in Opera nicht.

      Oder gleich als Einzeiler:
      if(document.appendChild){alert("ja");}

      Ansonsten sollte ein DOM-faehiger Browser (neben etlichen anderen Testmoeglichkeiten) auf
      if(document.documentElement) positiv anzusprechen sein.

      MfG, Thomas