Christoph Schnauß: Opera spielt nicht mit

hallo Forum ;-)

ich habe folgendes kleines Script:

<script language="javascript" type="text/javascript">
var pause = 0;
var obj_step = false;
var obj_speed = 0.006;
var obj_X = 0;
var obj_winkel = false;
var obj_ref = false;

function positionieren(obj_name, links, oben){
 // "Browserweiche" gekürzt:
   obj_ref="document.getElementById";
    if (navigator.appName == "Opera"){
    eval(obj_ref+'["'+obj_name+'"].style.top = oben');
    eval(obj_ref+'["'+obj_name+'"].style.left = links');
    } else {
    eval(obj_ref+'("'+obj_name+'").style.top = oben');
    eval(obj_ref+'("'+obj_name+'").style.left = links');
    }
}

function bewegung() {
  positionieren("frac",obj_X,0);
  obj_X += obj_step;
  obj_X = Math.sin(obj_winkel)*300 + 400;
  obj_Y = Math.cos(obj_winkel)*250 + 280;
  positionieren("frac1", obj_X, obj_Y);
  obj_winkel += obj_speed;
  timer = window.setTimeout("bewegung();", pause);
}
</script>

Das soll eine kleine fraktale Grafik (mit dem Namen "frac") in Ellipsenform über den Bildschirm wandern lassen und tut das auch im IE und mit mozilla/Netscape. Aber mit Opera (6) bekomme ich Probleme. Einen Teil konnte ich beheben, indem in der Funktion "positionieren" für den Objektnamen (Variable "obj_name") die eckigen Klammern bei der if-Abfrage eingesetzt wurden. Aber die Funktion "bewegung" führt Opera nicht aus und gibt leider auch keinerlei Fehlerwarnung.
"frac" wird mit CSS so formatiert:

<style type="text/css">
#frac {position: absolute; top: -100; visibility: visible }
</style>

und mit einem button von der Webseite aus so aufgerufen:

<input type="button" value="Animation starten" onclick="bewegung()">

Wie bereits angeführt, machen mozilla/Netscape und Internet Explorer ohne weitere Bemerkungen mit, nur Opera kann ich nicht dazu bewegen. Daß auch Netscape 4.7x nicht mitspielen mag, ist mir wurscht. Netscape 4.7x velangt ebenfalls die eckigen Klammern, die ich mit einer weiteren if-Abfrage ins Script schreiben müßte, aber auch wenn das drinsteht, spielt er nicht mit und stellt komischerweise auf der Javascript-Konsole auch keine Fehlermeldung bereit. Übrigens mag auch der Konqueror (3) nicht mitmachen.

Hat jemand nen Hinweis, wie ich diese "kleineren" Browser dazu bewegen kann, mein Script richtig auszuführen? Mir geht es (erst einmal) nur um DOM-Fähige Browser, die "getElementById" verstehen.

Grüße aus Berlin

Christoph S.

  1. Hi Christoph,

    eval(obj_ref+'["'+obj_name+'"].style.top = oben');
        eval(obj_ref+'["'+obj_name+'"].style.left = links');

    eval(obj_ref+'("'+obj_name+'").style.top = oben');
        eval(obj_ref+'("'+obj_name+'").style.left = links');

    eventuell fehlt Opera hier bei der Positionierung das abschließende "px".

    <style type="text/css">
    #frac {position: absolute; top: -100; visibility: visible }
    </style>

    Probiere es hier mit top: -100px;
                                  ^^
    Ist zwar ungetestet und ein Schuß in's Blaue, aber es kann durchaus daran liegen. Maßeinheiten sind nämlich niemals böse ;)

    LG Orlando

    --
    SELF-TREFFEN 2002
    http://www.rtbg.de/selftreffen/
    http://www.megpalffy.org/temp/penneninhh.html

    1. hi Orlando,

      Probiere es hier mit top: -100px;
                                    ^^
      Ist zwar ungetestet und ein Schuß in's Blaue, aber es kann durchaus daran liegen. Maßeinheiten sind nämlich niemals böse ;)

      danke für den Hinweis  -  bringt leider nix, bis auf die Erinnerung, daß man beim "Zusammenstreichen" von Scripts, damit sie in ein posting passen, sehr sorgfältig vorgehen muß. Die Angabe "px" wird im Script durch eine Variable übernommen  -  weil es im gesamten Script auch noch "pt" gibt. Bloß das ist für meine Fragestellung unerheblich gewesen.
      Wenn du Zeit dafür hast, probier das gute Stück doch mal aus.

      Grüße aus Berlin

      Christoph S.

      1. Hi Christoph,

        Wenn du Zeit dafür hast, probier das gute Stück doch mal aus.

        gerne, aber würdest du sie bitte vollständig hochladen? Vielleicht gibt's ja noch ein Problem, das ich bisher nicht gesehen habe.

        LG Orlando

        --
        SELF-TREFFEN 2002
        http://www.rtbg.de/selftreffen/
        http://www.megpalffy.org/temp/penneninhh.html

        1. hallo ;-)

          gerne, aber würdest du sie bitte vollständig hochladen? Vielleicht gibt's ja noch ein Problem, das ich bisher nicht gesehen habe.

          hm, grummel, da hab ich nen Problem: das ist eine Seite aus dem "Update-Paket" meiner eigenen Adresse, und wenn ich das jetzt im alpha-Stadium alles hochlade, sind ziemlich viele noch nicht validierte Seiten dabei ... ich hab das Beispiel mal auf http://www.christoph-schnauss.de/temp/dyn01.htm abgelegt. Aber bitte: alpha-Stadium ;-)

          Grüße

          Christoph S.

          1. Hi nochmal,

            hm, grummel, da hab ich nen Problem: das ist eine Seite aus dem "Update-Paket" meiner eigenen Adresse, und wenn ich das jetzt im alpha-Stadium alles hochlade, sind ziemlich viele noch nicht validierte Seiten dabei ...

            hast du Angst, dass dich jemand prügelt? :p

            http://www.christoph-schnauss.de/temp/dyn01.htm

            Zunächst fällt mir die gefährliche Opera-Prüfung auf:

            if (navigator.appName == "Opera")

            solltest du auf jeden Fall durch

            if (window.opera)

            ersetzen. Das ist die einzig zuverlässige Methode.

            Woran es nun genau liegt, dass es nicht funktioniert, weiß ich nicht. Könnte am eval() liegen, ist leider absolut nicht mein Fachgebiet. Ich verstehe nicht ganz, warum du die eckigen Klammern für Opera benötigst,

            document.getElementById('id').style.top

            funktioniert nämlich.

            Gute Nacht oder fohes Schaffen ;)
            LG Orlando

            --
            SELF-TREFFEN 2002
            http://www.rtbg.de/selftreffen/
            http://www.megpalffy.org/temp/penneninhh.html

            1. grüßchen ...

              hast du Angst, dass dich jemand prügelt? :p

              nö, aber "veröffentlichen" möchte man ja nur was, was man selber als einigermaßen fehlerfrei empfindet. Haue gibts sowieso, egal wie genial man gearbeitet hat *g*

              Zunächst fällt mir die gefährliche Opera-Prüfung auf:
                if (navigator.appName == "Opera")
              solltest du auf jeden Fall durch
                if (window.opera)
              ersetzen. Das ist die einzig zuverlässige Methode.

              ja, ok, ist aber subkritisch und behebt den "Fehler" nicht

              document.getElementById('id').style.top
              funktioniert nämlich.

              oh. Bei mir (Opera 6.04) nicht. Da bekam ich einen Warnhinweis, und der verschwand erst, als ich die eckigen Klammern gesetzt hatte

              Gute Nacht oder fohes Schaffen ;)

              naja, mehr zweiteres ;-)
              schlaf gut

              Christoph S.

              --
              SELF-TREFFEN 2002

              http://www.rtbg.de/selftreffen/
              http://www.megpalffy.org/temp/penneninhh.html

    2. hi

      Probiere es hier mit top: -100px;

      das sollte Opera egal sein - immerhin liefert er ja sogar die entsprechenden Werte im CSS als Integers zurück - als ohne Einheit, wenn man die über JS auslesen will.

      Grüße aus Bleckede

      Kai

      1. hallo,

        immerhin liefert er ja sogar die entsprechenden Werte im CSS als Integers zurück - als ohne Einheit, wenn man die über JS auslesen will.

        richtig. Was mich aber wirklich verblüfft, ist, daß ich trotz der "Verweigerung" keinerlei Fehlermeldung bekomme, obwohl ich meinen Opera so eingerichtet habe, daß er Scriptfehler sofort im alert-Fenster anzeigt. Auch die Apache-logs sagen nix aus, da steht nichts drin. Trotzdem tut ers einfach nicht, und da bin ich dann einfach ratlos, weil das Teil ja mit mozilla (der doch auch ziemlich empfindlich ist und ziemlich genaue Protokolle liefert) reibungslos funktioniert  -  vom IE will ich gar nicht nochmal reden, der tuts natürlich.
        Ich hab die Seite mal auf http://www.christoph-schnauss.de/temp/dyn01.htm abgelegt, zum Nachschauen. Script ist im Quelltext enthalten, also keine externe JS oder CSS. Ahja, und was ich zu einer "Variablen, die 'px' oder 'pt' sein kann" geschrieben hatte, ist erstmal nicht mehr drin, weil das für das eigentliche Problem unerheblich ist. Prinzipiell kenne ich das, daß Opera gerne die Maßeinheiten haben möchte, und bemühe mich normalerweise darum, das zu berücksichtigen  -  hatte damit bisher auch nie Probleme. Aber hier sind es in solchen Scriptzeilen wie
            eval(obj_ref+'["'+obj_name+'"].style.top = oben');
            eval(obj_ref+'["'+obj_name+'"].style.left = links');
        lauter Variablen, die mehrfach umgefüllt und schließlich auch noch über "Math.sin" bzw. "Math.cos" dynamisch verändert werden, und ich wüßte nicht genau, wie ich da noch ein ".px" so anhängen könnte, daß es Opera mitmacht.

        Grüße aus Bleckede

        Grüße aus Berlin retour

        Christoph S.

        1. hi

          richtig. Was mich aber wirklich verblüfft, ist, daß ich trotz der "Verweigerung" keinerlei Fehlermeldung bekomme, obwohl ich meinen Opera so eingerichtet habe, daß er Scriptfehler sofort im alert-Fenster anzeigt.

          geht sowas clientseitig..?!

          noch ein Vorschlag meienrseits: Verzichte komplett auf alternative Scripte für document.all oder document.layers - ich finde es ist mehr als Zeit diese Dinger von den Seiten zu kicken.

          Grüße aus Bleckede

          Kai

          1. morgens,

            geht sowas clientseitig..?!

            du kannst bei Opera (6.04, andere hab ich nicht mehr) einstellen, daß du Scriptfehler angezeigt bekommen möchtest.

            noch ein Vorschlag meienrseits: Verzichte komplett auf alternative Scripte für document.all oder document.layers - ich finde es ist mehr als Zeit diese Dinger von den Seiten zu kicken.

            schon gut  -  die Dinger waren eh im Script auskommentiert und sind Relikte. An _dieser_ Stelle sind wir übrigens bekanntlich absolut derselben Ansicht

            Grüße aus Berlin

            Christoph S.

  2. Hi Christoph,

    nimm die Opera-Abfrage einfach heraus, denn

    obj_ref="document.getElementById";
      eval(obj_ref+'("'+obj_name+'").style.top = oben');
      eval(obj_ref+'("'+obj_name+'").style.left = links');

    funktioniert, habe </?m=108135&t=19226> einfach ausprobiert :)

    LG Orlando

    --
    SELF-TREFFEN 2002
    http://www.rtbg.de/selftreffen/
    http://www.megpalffy.org/temp/penneninhh.html

    1. hallo Orlando,

      nimm die Opera-Abfrage einfach heraus

      hab ich (offline) gmeacht. Und da passiert (auch nach Cache-Auskehren usw.) was ganz Eigentümliches: wenn ich Opera sage, er soll sich als IE oder als Netscape tarnen, kann er es plötzlich  -  wenn auch die timeout-Werte nicht befolgt werden und die Grafik viel zu schnell über den Screen geschossen wird. Das müßte sich aber mit Leichtigkeit einrichten lassen.
      Wenn ich sage, er soll sich weiterhin stolz Opera nennen, tut ers immer noch nicht bzw. gibt mir nen alert, daß er eckige Klammern haben will. Naja, ich hab ja schon öfter erlebt, daß mein Rechner bloß mal so ein paar Stunden Schlaf brauchte, vielleicht klappt morgen (nachher) doch alles ...

      besten Dank

      Christoph S.