Andreas: Problem mit Layern (Kasten Bier als Belohnung)

Hallo ich habe ein Problem mit dem Anzeigen/Verbergen von Layern in einer dynamisch erzeugten Tabelle. Wer mir zu einer Lösung verhilft, bekommt einen Kasten Bier spendiert:-)

---> Also zunächst habe ich ein Script, in dem ich den Layer innerhalb der Funktion abfrage()  definiere + 2 Funktionen (zeigen + verstecken)

<SCRIPT LANGUAGE="JavaScript">

var lay2;

function abfrage ()
{
  var version=navigator.appVersion.charAt(0);

if (navigator.appName=='Microsoft Internet Explorer' && parseInt(version)>='4')
     {

lay2=document.getElementById("Prom\_name[i]").style;
     }
  }

function Info_verstecken (peElementByID)

{

// Über diese Funktion wird der Layer ausgeblendet

lay2.visibility="hidden";

}

function Info_zeigen (peElementByID)

{

// Über diese Funktion wird der Layer eingeblendet

lay2.visibility="visible";

}

</SCRIPT>

---> im Body wird zunächst abfrage geladen u. dadurch habe ich dann auch die Definition des Layers

<BODY  onload="abfrage()">

---> Dann habe ich eine Tabelle deren Inhalt dynamisch erzeugt wird, d.h. ich weiss also noch nicht wie viele Zeilen ich mal bekomme. Das erste Feld jedes Datensatzes
Prom_nr[i] wird als Link dargestellt u. mit mouseover/mouseout die Funktionen (zeigen+verstecken) angesteuert.

<TABLE border=0 cellspacing=1 cellpadding=2>
   <tr>
     <td >
       PROM-NR
     </td>
     <td >
       PROM-NAME
     </td>
     <td class=listheader>
       PROM-NAME
     </td>
  repeat with i from 1 to Prom\_nr.dim
   <tr >
     <td>

<A HRE=LINK" onmouseover="Info_zeigen()" onmouseout="Info_verstecken()"> Prom\_nr[i]</A>

</td>
     <td>
     <DIV ID="Prom\_name[i]" STYLE="visibility:hidden">
       Prom\_nr[i]       </DIV>

</td>
     <td>
     Prom\_name[i]
     </td>
   </tr>
   end

</table>

Beim Script wie oben abgebildet passiert folgendes (siehe Tabelle A). Egal ob ich nun mit der Mouse mich auf 12, 34 oder 78 befinde, ich erhalte stets in der zweiten Spalte XYZ

Beispieltabelle A

PROM-NR     PROM-NAME    PROM-NAME
12            XYZ        XYZ
34                       ABC
78                       SDS

Wenn ich innerhalb der Funktion abfrage() folgendes als Index eingebe
lay2=document.getElementById("Prom\_name[3]").style;
dann wird egal ob ich mit der Mouse mich auf 12, 34 oder 78 befinde stets der dritte Name angezeigt (siehe Tabelle B)

Beispieltabelle B

PROM-NR     PROM-NAME     PROM-NAME
12                       XYZ
34                       ABC
78            SDS        SDS

So und was ich aber haben will, ist der Fall, dass wenn ich mit der Mouse auf der 34 bin (das entspricht Prom_nr[2]) ich dann auch Prom_name[2] (ABC) angezeigt bekomme,....und  bei Prom_nr[1]) den Prom_name[1] (XYZ).... und  bei Prom_nr[3]) den Prom_name[3] (SDS)

Beispieltabelle C

PROM-NR    PROM-NAME    PROM-NAME
12                 XYZ  XYZ
34                 ABC  ABC
78                 SDS  SDS

Ich bedanke mich schon mal im voraus, viele Grüße
Andreas

  1. <SCRIPT LANGUAGE="JavaScript">

    hier fehlt das type Attribut und das language Attribut ist veraltet.

    var lay2;

    function abfrage ()
    {
      var version=navigator.appVersion.charAt(0);

    if (navigator.appName=='Microsoft Internet Explorer' && parseInt(version)>='4')

    Das ist keine sinnvolle Abfrage, du solltest hier auf das testen was du verwendest:

    if(document.getElementById)

    {

    lay2=document.getElementById("Prom\_name[i]").style;

    Ich geh mal davon aus (hab die Specs nicht im Kopf) das Backticks nicht gültig sind in ID's.

    Ich vermute du willst hier dynamisch das i zuweisen, das geht so nicht.
    Zumal du beim Aufruf auch gar nicht übermittelst welches i du zeigen/vertsecken willst.

    ---> im Body wird zunächst abfrage geladen u. dadurch habe ich dann auch die Definition des Layers

    <BODY  onload="abfrage()">

    Ja aber nur von dem layer mit den Namen Prom\_name[i], den gibt es aber nicht, du hättest eigentlich hier schon eine Fehlermeldung erhalten sollen.

    Du musst beim Aufruf jeweils das i als Parameter mit geben und dann entsprechend in deinen funktionen einsetzen:

    Struppi.

    1. <SCRIPT LANGUAGE="JavaScript">

      hier fehlt das type Attribut und das language Attribut ist veraltet.

      var lay2;

      function abfrage ()
      {
        var version=navigator.appVersion.charAt(0);

      if (navigator.appName=='Microsoft Internet Explorer' && parseInt(version)>='4')

      Das ist keine sinnvolle Abfrage, du solltest hier auf das testen was du verwendest:

      if(document.getElementById)

      {

      lay2=document.getElementById("Prom\_name[i]").style;

      Ich geh mal davon aus (hab die Specs nicht im Kopf) das Backticks nicht gültig sind in ID's.

      Ich vermute du willst hier dynamisch das i zuweisen, das geht so nicht.
      Zumal du beim Aufruf auch gar nicht übermittelst welches i du zeigen/vertsecken willst.

      ---> im Body wird zunächst abfrage geladen u. dadurch habe ich dann auch die Definition des Layers

      <BODY  onload="abfrage()">

      Ja aber nur von dem layer mit den Namen Prom\_name[i], den gibt es aber nicht, du hättest eigentlich hier schon eine Fehlermeldung erhalten sollen.

      Du musst beim Aufruf jeweils das i als Parameter mit geben und dann entsprechend in deinen funktionen einsetzen:

      Struppi.

      FRAGE: Wie gebe ich beim Aufruf das i mit??? Das ist ja genau das Problem.

      1. FRAGE: Wie gebe ich beim Aufruf das i mit??? Das ist ja genau das Problem.

        keine Ahnung, da ich nicht weiß mit was du diese Tabelle baust.

        Aber das Prinzip ist so

        function Info_verstecken (ID)
        {
        if(!document.getElementById) return;

        var obj = document.getElementById('Prom_name[' + ID + ']');

        if (!obj) return;

        obj.layer.visibility = "hidden";
        }

        function Info_zeigen (ID)
        {
        if(!document.getElementById) return;

        var obj = document.getElementById('Prom_name[' + ID + ']');

        if (!obj) return;

        obj.layer.visibility = "visible";

        }

        Die Links sehen dann so aus:

        <A
         HREF="LINK"
         onmouseover="Info_zeigen(0)"
         onmouseout="Info_verstecken(0)"

        Prom_nr[0]</A>

        Wenn der Text des Links der gleiche ist wie die ID des textes kannst du auch veruchen diesen zu verwenden

        <A
         HREF="LINK"
         onmouseover="Info_zeigen(this.text)"
         onmouseout="Info_verstecken(this.text)"

        Prom_nr[0]</A>

        funktioniert aber glaueb nicht im IE und du müßtest die Funktionen entsprechenden ändern.

        Struppi.

        1. FRAGE: Wie gebe ich beim Aufruf das i mit??? Das ist ja genau das Problem.

          keine Ahnung, da ich nicht weiß mit was du diese Tabelle baust.

          Aber das Prinzip ist so

          function Info_verstecken (ID)
          {
          if(!document.getElementById) return;

          var obj = document.getElementById('Prom_name[' + ID + ']');

          if (!obj) return;

          obj.layer.visibility = "hidden";
          }

          function Info_zeigen (ID)
          {
          if(!document.getElementById) return;

          var obj = document.getElementById('Prom_name[' + ID + ']');

          if (!obj) return;

          obj.layer.visibility = "visible";

          }

          Die Links sehen dann so aus:

          <A
           HREF="LINK"
           onmouseover="Info_zeigen(0)"
           onmouseout="Info_verstecken(0)"

          Prom_nr[0]</A>

          Wenn der Text des Links der gleiche ist wie die ID des textes kannst du auch veruchen diesen zu verwenden

          <A
           HREF="LINK"
           onmouseover="Info_zeigen(this.text)"
           onmouseout="Info_verstecken(this.text)"

          Prom_nr[0]</A>

          funktioniert aber glaueb nicht im IE und du müßtest die Funktionen entsprechenden ändern.

          Struppi.

          Hallo Struppi,
          jetzt habe ich das Script wie folgt geändert:

          <SCRIPT LANGUAGE="JavaScript">

          var lay2;

          function abfrage ()
          {
            var version=navigator.appVersion.charAt(0);

          if (navigator.appName=='Microsoft Internet Explorer' && parseInt(version)>='4')
               {
          lay2=document.getElementById("Prom\_name[i]").style;

          }

          }

          function Info_verstecken (ID)
          {
          if(!document.getElementById) return;

          var obj = document.getElementById('Prom_name[' + ID + ']');

          if (!obj) return;

          obj.layer.visibility = "hidden";
          }

          function Info_zeigen (ID)
          {
          if(!document.getElementById) return;

          var obj = document.getElementById('Prom_name[' + ID + ']');

          if (!obj) return;

          obj.layer.visibility = "visible";

          }

          </SCRIPT>

          ******

          <BODY  onload="abfrage()">

          ******

          <A HREF="" onmouseover="Info_zeigen(Prom\_nr[i])" onmouseout="Info_verstecken(Prom\_nr[i])"> Prom\_nr[i]</A>

          ******

          <DIV ID="Prom_name" STYLE="visibility:hidden">
                 Prom\_name[i]
                </DIV>

          ******

          Das Problem: Wenn ich mit der Mouse über einen Link fahre, bekomme ich den Fehler, dass der Inhalt des Links
          also 12, 34, oder 78 nicht bekannt ist.

          Naja zumindest sind wir an dieser Stelle schon einen Schritt weiter. Ich möchte aber das "verdammte" i übergeben.
          Hast Du noch 'ne Idee??

          Gruss
          Andreas

          1. Kürz doch bitte die sachen die nicht notwendig sind weg, danke.

            jetzt habe ich das Script wie folgt geändert:

            <SCRIPT LANGUAGE="JavaScript">

            nach ie vor fehlt hier das Type Attribut.

            var lay2;

            function abfrage ()
            {
              var version=navigator.appVersion.charAt(0);

            if (navigator.appName=='Microsoft Internet Explorer' && parseInt(version)>='4')
                 {
            lay2=document.getElementById("Prom\_name[i]").style;

            }

            }

            Das ist überflüssig.

            <BODY  onload="abfrage()">

            abfrage() brauchst du nicht.

            ******

            <A HREF="" onmouseover="Info_zeigen(Prom\_nr[i])" onmouseout="Info_verstecken(Prom\_nr[i])"> Prom\_nr[i]</A>

            ******

            <DIV ID="Prom_name" STYLE="visibility:hidden">
                   Prom\_name[i]
                  </DIV>

            Ich kapier nicht was du machst. was ist denn i?
            Soll das ein Index sein oder ein String?
            Warum benutzt du nach wie vor die Backticks?
            Warum hat das DIV plötzlich den Namen 'Prom_name'?
            Hat das keinen Index?

            Wenn ich dich richtig verstehe, solltest du denn ID's Zahlen von 0 bis anzahl anhängen und diese Zahl als Parameter übergeben.

            Struppi.

            1. <SCRIPT LANGUAGE="JavaScript">

              nach ie vor fehlt hier das Type Attribut.

              welches attribut meinst du denn???

              ******

              <A HREF="" onmouseover="Info_zeigen(Prom\_nr[i])" onmouseout="Info_verstecken(Prom\_nr[i])"> Prom\_nr[i]</A>

              ******

              <DIV ID="Prom_name" STYLE="visibility:hidden">
                     Prom\_name[i]
                    </DIV>

              Ich kapier nicht was du machst. was ist denn i?
              Soll das ein Index sein oder ein String?
              Warum benutzt du nach wie vor die Backticks?
              Warum hat das DIV plötzlich den Namen 'Prom_name'?
              Hat das keinen Index?

              i ist der index, d.h. diese tabelle wird mit einem loop erstellt, so dass bei i=1 der erste Datensatz gelesen wird usw.

              Lasse ich die backticks weg, z.B. Info_zeigen(Prom_nr[i]) --->Prom_nr ist nicht definiert

              Also mein Problem ist immer noch, dass ich nicht weiss, wie ich den index erfassen soll

              Gruss Andreas

              1. Hallo Andreas

                <SCRIPT LANGUAGE="JavaScript">

                nach ie vor fehlt hier das Type Attribut.

                welches attribut meinst du denn???

                type="text/javascript"

                ******

                <A HREF="" onmouseover="Info_zeigen(Prom\_nr[i])" onmouseout="Info_verstecken(Prom\_nr[i])"> Prom\_nr[i]</A>

                ******

                <DIV ID="Prom_name" STYLE="visibility:hidden">
                       Prom\_name[i]
                      </DIV>

                Ich kapier nicht was du machst. was ist denn i?
                Soll das ein Index sein oder ein String?
                Warum benutzt du nach wie vor die Backticks?
                Warum hat das DIV plötzlich den Namen 'Prom_name'?
                Hat das keinen Index?

                i ist der index, d.h. diese tabelle wird mit einem loop erstellt, so dass bei i=1 der erste Datensatz gelesen wird usw.

                Lasse ich die backticks weg, z.B. Info_zeigen(Prom_nr[i]) --->Prom_nr ist nicht definiert

                Warum zeigst uns dann nicht wie dein HTML wirklich aussieht. Diese rumraterei macht nicht wirklich Spaß.

                ich gehe mal davon aus es sieht ungefähr so aus:

                <DIV ID="Prom_name0" STYLE="visibility:hidden">Prom_name[0]</DIV>

                <DIV ID="Prom_name1" STYLE="visibility:hidden">Prom_name[1]</DIV>

                <DIV ID="Prom_name2" STYLE="visibility:hidden">Prom_name[2]</DIV>

                usw.

                Dann musst du noch die funktionen anpassen und zwar folgende Zeilen

                var obj = document.getElementById('Prom_name[' + ID + ']');

                ändern in

                var obj = document.getElementById('Prom_name' + ID);

                und deine Links:

                <A HREF="" onmouseover="Info_zeigen(0)" onmouseout="Info_verstecken(0)"> Prom_nr[0]</A>

                <A HREF="" onmouseover="Info_zeigen(1)" onmouseout="Info_verstecken(1)"> Prom_nr[1]</A>

                usw.

                Das geht mit Sicherheit einfacher, aber dazu fehlen noch infos.

                Struppi.

    2. Hallo!

      if(document.getElementById)

      Ich habe bisher immer folgende Abfrage benutzt und auch immer empfohlen bekommen:

      if ((typeof(document.getElementById))=="function") or (typeof(document.getElementById)=="object"))

      bzw. if (typeof(document.getElementById)!="undefined")

      Wo liegt der Unterschied? Liefert obige Abfrage nicht in alten IE-Versionen den Fehler getElementById ist nicht definiert?

      Gruß

      mdkiller

      1. Ich habe bisher immer folgende Abfrage benutzt und auch immer empfohlen bekommen:

        von Thomas Lahn?

        if ((typeof(document.getElementById))=="function") or (typeof(document.getElementById)=="object"))

        wenn jemand die Methode überschreibt sie damit nicht mehr zu Verfügung steht, dann hilft das, aber wer sollte sowas tun?

        bzw. if (typeof(document.getElementById)!="undefined")

        schon eher.

        Wo liegt der Unterschied? Liefert obige Abfrage nicht in alten IE-Versionen den Fehler getElementById ist nicht definiert?

        nein (ich hab hier einen IE 4 und der macht nix dergleichen), da document existiert reicht die einfache Variante von mir, lediglich MZ wirft eine Warnung, wenn man auf undefinierte Attribute prüft, da aber in diesem Fall das Attribut existiert, sollte sich niemand beschwert

        Struppi.

        1. Hallo Struppi!

          von Thomas Lahn?

          Ich weiß es nicht mehr.

          if ((typeof(document.getElementById))=="function") or (typeof(document.getElementById)=="object"))

          wenn jemand die Methode überschreibt sie damit nicht mehr zu Verfügung steht, dann hilft das, aber wer sollte sowas tun?

          Man kann auch nur nach ...=="function" trennen, dann hat man nen Mozilla, beim IE ist es object

          bzw. if (typeof(document.getElementById)!="undefined")

          schon eher.

          Wo liegt der Unterschied? Liefert obige Abfrage nicht in alten IE-Versionen den Fehler getElementById ist nicht definiert?

          nein (ich hab hier einen IE 4 und der macht nix dergleichen), da document existiert reicht die einfache Variante von mir, lediglich MZ wirft eine Warnung, wenn man auf undefinierte Attribute prüft, da aber in diesem Fall das Attribut existiert, sollte sich niemand beschweren

          Na ja, Fehlermeldungen im IE kann man ja eh vergessen. Helfen sehr viel. Kriegte aber in meinen Anfängen öfter Fehlermeldungen, als ich if (opener) abgefragt habe. Na ja, neue Fenster vermeide ich jetzt einfach. Von daher auch kein Problem mehr mit sinnfreien Fehlermeldungen...

          So long,

          mdkiller

          1. Na ja, Fehlermeldungen im IE kann man ja eh vergessen. Helfen sehr viel. Kriegte aber in meinen Anfängen öfter Fehlermeldungen, als ich if (opener) abgefragt habe. Na ja, neue Fenster vermeide ich jetzt einfach. Von daher auch kein Problem mehr mit sinnfreien Fehlermeldungen...

            Der IE (hatte?) einige Probleme mit Fenster, wenn diese von Hand geschlossen wurden. Da halfen dann auch keine Abfragen mehr, jeder Zugriff wurde mit sehr kryptischen Fehlern quittiert (irgendwas mit Serveranwendung ist nicht mehr vorhanden oder sowas), das hat aber nichts damit zu tun.

            Wie gesagt, du kannst ohne Bedenken if(document.DOMFunktion) schreiben. nur wenn du sicher sein willst, dass Mozilla keine Warnungen ausgibt, ist ein if(typeof document.attribut == 'undefined') vorzuziehen.

            Struppi.

  2. Hi,

    <DIV ID="Prom\_name[i]" STYLE="visibility:hidden">

    Eine id darf weder ` noch [ noch ] enthalten.

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.mud-guard.de/