Glowhead: SELFHTML Bilderbuch - probs mit moz1.6 u. ns7.1

Hallo liebes Forum,
habe schon einiege Zeit ein Problem mit dem SELFHTML Bilderbuch:
http://de.selfhtml.org/dhtml/beispiele/bilderbuch.htm

Und zwar habe ich angefangen es einwenig auf meine Bedürfnisse abzuändern, indem ich mitlerweile eine Möglichkeit gefunden habe nicht unbedingt das erste Bild aus dem array auch als erstes zu laden.
Das funtzt auch soweit so gut!

Jetzt das Problem (nur im ns7.1 und moz1.6 getestet):
Auf http://luneflame.de (meine Kunstseite - noch nicht fertig!) kann man in der Baumnavigation über das + von "luneflame art" die Submenus öffnen und dort die watercolor Bilder aufrufen. Wenn man nun eins der Bilder clickt so kommt man in die gallery.html. Hier tritt nun das Problem auf, das wenn man die Bilder weiterclickt, das zuerst aufgerufene, sich unter oder neben dem derzeitiegen, abgeschnitten aufbaut.
Da die Bilder verschiedene Maße haben würde ich gern das clip.rect ganz ausbaun oder eben dafür sorgen das nur das derzeitiege Bild dargestellt wird! Seht ech das doch am besten mal selber an. Der Quellcode läst komplett einsehn.

Dann habe ich noch ganz allgemein eine Frage zu den Bildern.
Wie groß (kb) sollten die max. sein und wie halte ich die Bildqualli wenn ich komprimiere?????

mfg Chris

  1. Hallo Glowhead,

    habe gerade keine Zeit das Problem genauer zu analysieren, Ursache ist auf jeden Fall, daß Du nach dem ersten Bildwechsel zwei img-Knoten unter dem Knoten "Bildbereich" hast, die auch beide dargestellt werden aber natürlich nur innerhalb des clip-Bereiches sichtbar sind.

    Schau Dir das ganze mal im DOM-Inspektor an.

    Das Problem tritt übrigens auch im Beispiel von selfHTML auf, nur hat es da wohl noch keiner gemerkt, da die Bilder in ihrer Größe alle gleich dem clip-Bereich sind.

    Schnelle Abhilfe: ändere nur den Wert des src-Attributes des img-tags ansteatt der ganzen DOM-Mimik.

    MfG
    Avalon

    1. Hallo Glowhead,

      zwischenzeitlich hatte ich Zeit mal genauer auf den selfHTML-Quelltext, den Du übernommen hast, zu blicken.

      Wie ich mir schon dachte, liegt die Ursache des Fehlverhaltens im folgendem Code:

      <div id="Bildbereich">
      </div>

      Dies ist zwar kein fehlerhafter Code, er erzeugt aber eine Textnode als einziges Kind des divs.

      Als nächstes fügt die Funktion Seite_init() mittels der DOM-Operationen
      img = document.createElement("img");
      ... .appendChild(img)
      einen Bildelement als letzten Knoten dem divs hinzu.

      Dann macht der Urheber des Scriptes einen logischen Fehler, denn er ersetzt in der Funktion Bildwechsel() das erste Kind des divs, die TextNode:
      getElem("id","Bildbereich",null).replaceChild(img, getElem("id","Bildbereich",null).firstChild);

      Nun gibt es mehrer Lösungen Deines Problems:

      1. in der Funktion Bildwechsel():
      getElem("id","Bildbereich",null).replaceChild(img, getElem("id","Bildbereich",null).lastChild);

      2. in der Funktion SEITE_init():
      ein replaceChild statt appendChild

      3. im HTML code:
      <div id="Bildbereich"></div>
      im die Erzeugung der TextNode zu verhindern.

      Gruß
      Avalon

      1. Hoi Avalon,
        hab mich der Variante bedient, wo der Zeilenumbruch aus dem
        <div id="Bildbereich"></div>
        weg ist, und es geht! juhhuuuuu!

        So ich hoffe mit den anderen Problemchen komm ich dann auch was weiter!

        Danke, mfg Glowhead

  2. Hallo lieber Forumer,

    Und zwar habe ich angefangen es einwenig auf meine Bedürfnisse abzuändern, indem ich mitlerweile eine Möglichkeit gefunden habe nicht unbedingt das erste Bild aus dem array auch als erstes zu laden.
    Das funtzt auch soweit so gut!

    Da wäre ich mir nicht so sicher. Beim Aufrufen der Startseite schließt mein Mozilla 1.6 auf einem Linuxsystem alle Instanzen von sich selbst, als hätte ich killall mozilla-bin in die Konsole eingegeben! Dieses Problem taucht anscheinen manchmal auf, wenn ein Document als doc abgekürzt wird und in ihm per write() geschrieben wird. (Woran es genau liegt, weiß ich nicht)

    Daher kann ich Dich nicht verstehen, wenn Du "funtzt" im vermutlichen Sinnen von funktionieren schreibst. Ich habe mir den Quelltext angesehen - ohne um den Heißen Brei herumzureden: Er ist nicht Valid, es ist mir kein Grund ersichtlich, warum Du kein Framesetz verwedest, sondern mit Iframes arbeitest, warum Du Dich statt {<body leftmargin="0" rightmargin="0" topmargin="0" marginheight="0">} nicht eines Style-Sheets bedienst und es ist mir erst recht kein Grund ersichtlich, warum Du mit einem JavaScript alles ausgibst. Das ist für Dein Vorhaben

    1. unübersichtlich,
      2. unnötig,
      3. traffic-vergrößernd und
      4. ärgerlich, da zu Lasten meiner CPU,
      5. an der Realität vorbei.

    Erleuternd zu 5. möchte ich Dir kurz klar machen, daß ich fast ausschließlich über Tabs meines Browsers in einem Web navigiere, was zu unmöglichen Fehlermeldungen führt, da sich eine Dokumente auf ein parent beziehen, das sie in solchen Fällen nicht haben.
    Im übrigen sollte dies Dir auch die Unmöglichkeit eines Framesets aufzeigen, was der selben konzeptionellen Kurzsichtigkeit erliegt.

    Jetzt das Problem (nur im ns7.1 und moz1.6 getestet):
    Auf http://luneflame.de (meine Kunstseite - noch nicht fertig!) kann man in der Baumnavigation über das + von "luneflame art"

    Das ist der Titel des parent, tree und content aber kein Menüpunkt. (Nicht böse gemeint, ich habe nur erstmal blöde gesucht...)

    die Submenus öffnen und dort die watercolor Bilder aufrufen. Wenn man nun eins der Bilder clickt so kommt man in die gallery.html. Hier tritt nun das Problem auf, das wenn man die Bilder weiterclickt, das zuerst aufgerufene, sich unter oder neben dem derzeitiegen, abgeschnitten aufbaut.

    Ist doch wohl auch logisch. Zitat aus dem Quelltext der gallery.html:

    function Blaettern(Richtung) {
     parent.zeige = parent.zeige + Richtung;
     if(parent.zeige > Bild.length - 1) parent.zeige = 0;
     else if(parent.zeige < 0) parent.zeige = Bild.length - 1;
     if(DOM || MS)
       getElem("id","Bildbereich",null).style.clip="rect(0 0 450 0)";
     if(DOM && !MS && !OP) {
       var img = document.createElement("img");
       var src = document.createAttribute("src");
       src.nodeValue = Bild[parent.zeige].src;
       img.setAttributeNode(src);
       getElem("id","Bildbereich",null).replaceChild(img, getElem("id","Bildbereich",null).firstChild);
     }

    Vielleicht hast Du Dir mal ausgebenlassen, was firstChild ist. Es ist ein TextNode und nicht der von SEITE_init() erzeugte Bildknoten "img".

    Preisfrage an Dich: Warum nutzt Du unnötig viel Script-Text und bindest auch noch die DOM-Bibliothek ein, wenn Du nicht mehr machen willst, als in http://de.selfhtml.org/javascript/objekte/images.htm#src beschrieben? Sieh doch mal, was da oben für Grafiken in dem beispiel sind!:

    <img src="http://src.selfhtml.org/js11.gif" border="0" alt=""> <img src="http://src.selfhtml.org/netsc3.gif" border="0" alt=""> <img src="http://src.selfhtml.org/msie4.gif" border="0" alt="">

    Da die Bilder verschiedene Maße haben würde ich gern das clip.rect ganz ausbaun oder eben dafür sorgen das nur das derzeitiege Bild dargestellt wird! Seht ech das doch am besten mal selber an. Der Quellcode läst komplett einsehn.

    Dann habe ich noch ganz allgemein eine Frage zu den Bildern.
    Wie groß (kb) sollten die max. sein und wie halte ich die Bildqualli wenn ich komprimiere?????

    Die Frage reiche ich mal durch, da ich persönlich der Meinung bin: Gibt es was zu sehen, was sich lohnt, warte ich gerne.

    Gruß aus Berlin!
    eddi

    1. Hi eddi,
      man das sind ja viele Informationen! Danke ersteinmal!

      Ich nutze iframes weil ich noch andres mit der Seite vorhab als bisher zu sehen und weil ich sie schlichtweg für praktischer halte.

      Um das ganze für dich und andere Lnuxnutzer zugänglich zu machen müste ich also den javascript code so abändern das die doc's, document lauten??? Also immer document.write? Würde das gehen???

      Hab ich das richtig verstanden? Mit meinem derzeitigen Aufbau hab ich keine Chance dir eine Tab-Navi zu ermöglichen??? Oder doch???

      Das "set.timeout scrip" was du mir für meine Gallerie vorgeschlagen hast kann ich nicht brauchen! Da hät ich ja nen automatischen Bildwechsel!!!
      Ich möchte aber das der Anwender selber bestimmen kann wann er welches Bild weiterschaltet!

      Schön das du was die Bildergröße angeht derselben Meinung bist, nämlich lieber zu warten als irgent nen Pixelbrei zu sehen!

      mfg GlowHead

      1. Moin Moin,

        Ich nutze iframes weil ich noch andres mit der Seite vorhab als bisher zu sehen und weil ich sie schlichtweg für praktischer halte.

        Dazu hatte ich erst kürzlich meinen Standpunkt in einem Beispiel zu einem Frameset vertreten, der sich 1/1 (auch in Hinblick der HTTP-Header) auf Dich übertragen läßt. http://forum.de.selfhtml.org/archiv/2004/9/89531/#m535350

        Um das ganze für dich und andere Lnuxnutzer zugänglich zu machen müste ich also den javascript code so abändern das die doc's, document lauten?

        Auch Mozilla ist nur ein Programm... Es tritt nur bei meinem 1.6 auf, also vermutlich ein Bug, der aber in späteren Versionen bereitz behoben ist. Fazit sollte jedoch für Dich sein:

        JavaScript in sich geschlossen und auf sich selbst (auf
              das eigene document) beschränkt. document.write() wei-
              testgehend vermeiden und hartkodieren (damit hast Du
              auch gleich eine bessere Möglichkeit serverseitig deak-
              tiviertes JavaScript zu händeln).
              Die DOM-Bibliothek ist komplett überflüssig.

        Also immer document.write? Würde das gehen???

        for() bringt sicher Vorteile, da Wiederholungen eingespart werden. Jedoch sehe ich in Deinem Beispiel noch keinen Vorteil durch Trafficersparniss (ganz im Gegenteil).

        Hab ich das richtig verstanden? Mit meinem derzeitigen Aufbau hab ich keine Chance dir eine Tab-Navi zu ermöglichen??? Oder doch???

        Ja, das ist richtig. JavaScript wird abgebrochen, sowie ein Fehler auftritt. Dieser setzt bereis in der Funktion SEITE_init() in Zeile 57 {src.nodeValue = Bild[parent.zeige].src;} ein. Auch die anderen Funktionen beziehen sich auf ein var parent.zeige, den sie durch Tabs im Browser nicht haben; - nicht haben können. (mögliche Lösung: if(parent){};else{})

        Das "set.timeout scrip" was du mir für meine Gallerie vorgeschlagen hast kann ich nicht brauchen!

        Da bitte ich Dich um Aufklärung. Ich habe auch im Archiv nichts gefunden und gehe vorerst von einer Verwechslung aus. Im übrigen sehe ich, wie Du auch keinen Grund ein Interval oder ein setTimeout() zu nutzen, da der User selbst wählen sollte, wenn er zum nächsten bild wechselt.

        Gruß aus Berlin!
        eddi