Yadgar: Zentral gespeichertes und lokales Skript in derselben Datei?

High!

Das Problem mit dem Skalieren der Vorschaubilder für die Galerie-Seiten habe ich inzwischen lösen können (nachträgliches Verändern von img.width bzw. img.height ist offensichtlich für heutige Browser, also die aktuellen Versionen von IE und Firefox kein Problem mehr - das kommt davon, wenn man sich von lokal gespeicherten veralteten SelfHTML-Versionen kirre machen lässt...) und prinzipiell könnte ich jetzt die Sache zu Ende bringen...

...aber der Eleganz des Codes wegen habe ich noch ein Problem: es sind insgesamt acht Galerie-/Gallery-Seiten, jede mit sechs Vorschaubildern, die beim Überfahren mit der Maus die Bilder in größerer Version (angepaßt an die eingestellte vertikale Auflösung) anzeigen, jeweils in deutsch und englisch.

Die Funktionen für die Skalierung des Hintergrundbildes sowie das Anzeigen und Ausblenden der Großbilder (scale(), display() und remove()) sind für alle acht HTML-Dateien gleich, können also in einer separaten *.js-Datei untergebracht werden. Die Funktion für die auflösungsgerechte Skalierung der Vorschaubilder (imgscale())hingegen unterscheidet sich von Datei zu Datei, da die verwendeten Bilder nicht alle das gleiche Seitenverhältnis haben, aber aus Platzgründen auf einheitliche Höhe gebracht werden müssen.

Nun meine konkrete Fragen:
1. Kann ich nach dem Verweis auf die externe *.js-Datei noch einen zweiten <script>-Bereich hinzufügen, in dem dann lokal die jeweilige Variante von imgscale() notiert ist? Bei meinen bisherigen Versuchen wurde dieser Teil regelmäßig nicht berücksichtigt, die Vorschaubilder blieben unskaliert.

2. Ist es möglich, mit dem onLoad-Handler von <body> mehr als eine vorher definierte Funktion aufzurufen?

Bis bald im Khyberspace!

Yadgar

  1. das kommt davon, wenn man sich von lokal gespeicherten veralteten SelfHTML-Versionen kirre machen lässt...)

    Die muss sehr sehr alt sein. Wie ich schon sagte, der letzte Browser der nicht Bilder skalieren konnte war NC 4.

    ... Die Funktion für die auflösungsgerechte Skalierung der Vorschaubilder (imgscale())hingegen unterscheidet sich von Datei zu Datei, da die verwendeten Bilder nicht alle das gleiche Seitenverhältnis haben, aber aus Platzgründen auf einheitliche Höhe gebracht werden müssen.

    und wo ist das Problem dabei?

    Nun meine konkrete Fragen:

    1. Kann ich nach dem Verweis auf die externe *.js-Datei noch einen zweiten <script>-Bereich hinzufügen, in dem dann lokal die jeweilige Variante von imgscale() notiert ist? Bei meinen bisherigen Versuchen wurde dieser Teil regelmäßig nicht berücksichtigt, die Vorschaubilder blieben unskaliert.

    Du kannst so viele script Blöcke in deine Datei einbauen wie du willst, was aber nicht geht ist gleichzeitig eine externe Datei und einen Scriptblock in ein script Element.

    1. Ist es möglich, mit dem onLoad-Handler von <body> mehr als eine vorher definierte Funktion aufzurufen?

    Natürlich, aber du solltest stattdessen window.onload verwenden das hält deinen HTML Code sauber und ist übersichtlicher.

    Struppi.

    1. Hi,

      was aber nicht geht ist gleichzeitig eine externe Datei und einen Scriptblock in ein script Element.

      doch, das geht, und es ist bisweilen sogar sehr sinnvoll, dies zu tun. Der Scriptblock wird dann ausgeführt werden, wenn das Laden der externen Ressource fehlschlägt - wenn in dieser beispielsweise zwingend benötigte Funktionen liegen, kann man im Scriptblock Alternativ-Code unterbringen (z.B. leere Funktionsrümpfe), um JavaScript-Fehler zu vermeiden.

      1. Ist es möglich, mit dem onLoad-Handler von <body> mehr als eine vorher definierte Funktion aufzurufen?
        Natürlich, aber du solltest stattdessen window.onload verwenden das hält deinen HTML Code sauber und ist übersichtlicher.

      Und erspart die Konvertiererei von Strings zu Funktionen, die bei HTML-Attributen nötig ist. Einem Event-Handler als Objekteigenschaft kann man direkt eine Funktion bzw. Funktionsreferenz übergeben.

      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,

        Der Scriptblock wird dann ausgeführt werden, wenn das Laden der externen Ressource fehlschlägt - wenn in dieser beispielsweise zwingend benötigte Funktionen liegen, kann man im Scriptblock Alternativ-Code unterbringen (z.B. leere Funktionsrümpfe), um JavaScript-Fehler zu vermeiden.

        IIRC wird der Scriptblock *nicht* ausgeführt, falls z.B. das Laden fehlschlägt! Aus diesem Grund setze ich leere Funktionsrümpfe immer in einen separaten Scriptblock vorab.

        Der Scriptblock wird nur dann ausgeführt, wenn der Browser beim SCRIPT-Element kein SRC-Attribut kennt, also NN 2 oder die ersten IE 3. Dann führen die "neueren" Browser das externe Script aus, die alten halt den Block ...

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
      2. was aber nicht geht ist gleichzeitig eine externe Datei und einen Scriptblock in ein script Element.

        doch, das geht, und es ist bisweilen sogar sehr sinnvoll, dies zu tun. Der Scriptblock wird dann ausgeführt werden, wenn das Laden der externen Ressource fehlschlägt

        Dacht ich auch immer, ist aber nicht so.

        Struppi.

        1. Hi,

          doch, das geht, und es ist bisweilen sogar sehr sinnvoll, dies zu tun. Der Scriptblock wird dann ausgeführt werden, wenn das Laden der externen Ressource fehlschlägt
          Dacht ich auch immer, ist aber nicht so.

          das ist mir in der Tat neu, danke Dir & Cybaer für die Aufklärung.

          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
    2. High!

      Natürlich, aber du solltest stattdessen window.onload verwenden das hält deinen HTML Code sauber und ist übersichtlicher.

      Struppi.

      Habe ich gemacht, die Vorschaubilder bleiben aber trotzdem unskaliert!

      Hier mein Code:

      <script src="format.js" type="text/javascript"></script>
      // hier ist u. a. scale() definiert

      [...]
      <script type="text/javascript">
      window.onLoad = function scaleimgs()
      {
          imgs=document.getElementsByTagName("img");
          for (i=0; i<6; i++)
          {
            imgs[i].height=h/8.533;
            switch(i)
            {
              case 0:
              case 1:
              case 5:
                imgs[i].width=h/6.4;
                break;
              case 2:
                imgs[i].width=h/11.378;
                break;
              case 3:
                imgs[i].width=h/15.754;
                break;
              case 4:
                imgs[i].width=h/8.127;
                break;
            }
          }
      }
      </script>
      </head>
      <body onLoad="scale();">
      [...]

      Bis bald im Khyberspace!

      Yadgar

      Now playing: Govinda (Kula Shaker)

      1. <script type="text/javascript">
        window.onLoad = function scaleimgs()

        Es gibt keine Eigenschaft onLoad, JS ist case-sensitive und der Funktionsname ist hier überflüssig.

        {
            imgs=document.getElementsByTagName("img");
            for (i=0; i<6; i++)
            {
              imgs[i].height=h/8.533;
              switch(i)
              {
                case 0:
                case 1:
                case 5:
                  imgs[i].width=h/6.4;
                  break;
                case 2:
                  imgs[i].width=h/11.378;
                  break;
                case 3:
                  imgs[i].width=h/15.754;
                  break;
                case 4:
                  imgs[i].width=h/8.127;
                  break;

        Da sieht mir sehr umständlich aus, du kann doch die Seitenverhältnisse berechnen lassen

        <body onLoad="scale();">

        Das ist auch verkehrt, entweder oder.

        Struppi.

        1. High!

          Da sieht mir sehr umständlich aus, du kann doch die Seitenverhältnisse berechnen lassen

          *Klatschankopp*
          Natürlich! Hier meine verbesserte Version - und jetzt läuft es einwandfrei als Teil von scale()!

          imgs = new Array();
              imgs=document.getElementsByTagName("img");
              for (i=0; i<6; i++)
              {
                newHeight = 120 * (h/1024); // einheitliche Höhe für alle Bilder, ausgehend von 120 Pixeln bei 1280 x 1024 Bildschirmauflösung
                newWidth = newHeight * (imgs[i].width/imgs[i].height);
                imgs[i].width = newWidth;
                imgs[i].height = newHeight;
                imgs[i].style.visibility = "visible"; // CSS-Attribut "visibility" der geladenen Bilder ist zunächst auf "hidden" gesetzt, damit sie erst nach ihrer Verkleinerung tatsächlich angezeigt werden!
              }

          <body onLoad="scale();">

          Das ist auch verkehrt, entweder oder.

          Jetzt wohl nicht mehr...

          Bis bald im Khyberspace!

          Yadgar

          Now playing: No Sign Of Yesterday (Men At Work)

          1. imgs = new Array();
                imgs=document.getElementsByTagName("img");
                for (i=0; i<6; i++)
                {
                  newHeight = 120 * (h/1024); // einheitliche Höhe für alle Bilder, ausgehend von 120 Pixeln bei 1280 x 1024 Bildschirmauflösung
                  newWidth = newHeight * (imgs[i].width/imgs[i].height);

            Hats du das mal online nach dem leeren des Cache getestet? Das geht nur, wenn die Bilder schon geladen wurden, d.h. du kannst erst nachdem laden skalieren.

            Jetzt wohl nicht mehr...

            onload brauchst du immer noch, aber den der Bilder.

            Struppi.