egigmartin: Problem im IE mit getElementByName

Hallo,
ich habe ein Problem mit dem IE8, im 7er und 6er hab ich nicht geschaut aber ich denke das dort das gleiche passieren wird.

Ich hab mir eine simple kleine Funktion erstellt, welche ich per onclick aufrufe. Diese Funktion soll den aktiven Div ausblenden und einen neuen definierten einblenden.

Hier die Funktion:

  
function zeigeInhalt( ort ) {  
  
    var text = document.getElementsByName('Inhalt');  
  
    for( var i=0; i<text.length; i++ ) {  
        document.getElementsByName('Inhalt')[i].className = 'hide';  
    }  
  
    document.getElementById(ort).className = 'show';  
	  
}  

Zur Erklärung:
Als erstes werden, durch die For-Schleife, alle Divs die jeweils mit name="Inhalt" definiert sind, ausgeblendet, was dann per CSS -> display:none; über die Klasse class="hide" funktioniert.
Dann hat jeder Div eine eigene id, die mit dem Titel eines Links übereinstimmt. So wird dann über onclick="zeigeInhalt(this.title)" der richtige Inhalt angezeigt.

Das funktioniert aber nicht im IE8, was ich auf den falschen Platz des name-Tags schließe.
Im IE8 wird zwar der jeweilige Inhalt eingeblendet aber nicht der Rest ausgeblendet, sodas sich die Inhalte schön untereinander auftürmen.

Ich bräuchte nun eine kleine Hilfestellung um das auch im IE8 zum laufen zu bringen

  1. @@egigmartin:

    nuqneH

    Als erstes werden, durch die For-Schleife, alle Divs die jeweils mit name="Inhalt" definiert sind, ausgeblendet

    Alle oder keiner? 'div' darf kein @name haben.

    Qapla'

    --
    Volumen einer Pizza mit Radius z und Dicke a: pi z z a
    1. @@egigmartin:

      nuqneH

      Als erstes werden, durch die For-Schleife, alle Divs die jeweils mit name="Inhalt" definiert sind, ausgeblendet

      Alle oder keiner? 'div' darf kein @name haben.

      Qapla'

      Im Firefox werden alle ausgeblendet, im IE8 passiert dahingehend nichts, dort greift halt die for-Schleife nicht.

      Ja, ich weiß das ein Div kein Name haben sollte aber das ist ja mein Problem, wie soll ich denn sonst alle ansprechen, das diese vorerst ausgeblendet werden damit dann der angeklickte im nachhinein wieder eingeblendet wird?

      1. Hallo enigmartin,

        Ja, ich weiß das ein Div kein Name haben sollte aber das ist ja mein Problem, wie soll ich denn sonst alle ansprechen, das diese vorerst ausgeblendet werden damit dann der angeklickte im nachhinein wieder eingeblendet wird?

        • über eine fortlaufende ID,
        • über getElementsByTagname, wenn die DIVs in einem Container liegen
            (getElementById("Id-des_Containers").getElementsByTagName("div")),
        • über den Klassennamen und eine der vielen getElementsByClassName-Methoden aus dem Netz.

        Gruß, Jürgen

        1. Hi,

          Ja, ich weiß das ein Div kein Name haben sollte aber das ist ja mein Problem, wie soll ich denn sonst alle ansprechen, das diese vorerst ausgeblendet werden damit dann der angeklickte im nachhinein wieder eingeblendet wird?

          • über eine fortlaufende ID,
          • über getElementsByTagname, wenn die DIVs in einem Container liegen
              (getElementById("Id-des_Containers").getElementsByTagName("div")),
          • über den Klassennamen und eine der vielen getElementsByClassName-Methoden aus dem Netz.

          oder, und jetzt werden alle Validator Liebhaber mit Gegenständen nach mir werfen:
          Du gibst diesen Elementen neben dem Namen auch noch die ID.
          <div name="inhalt" id="inhalt"></div>

          Ist zwar invalide, aber dann funktioniert im IE auch getElementsByName().

          Und jetzt geh ich in Deckung :P

          ~dave

          1. Mahlzeit dave,

            Du gibst diesen Elementen neben dem Namen auch noch die ID.
            <div name="inhalt" id="inhalt"></div>

            Ist zwar invalide, aber dann funktioniert im IE auch getElementsByName().

            Warum sollte man irgendwelche Krücken von hinten durch die Brust ins Auge knoten, wenn man auch ganz einfach die *Ursache* des Problems beheben kann?

            Tz, tz, tz ... manchmal verstehe ich einfach nicht, weshalb sich Leute sehendes Auges und bewusst das Leben schwer machen.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          2. Hallo dave,

            Und jetzt geh ich in Deckung :P

            das ist auch gut so.

            Gruß, Jürgen

          3. Hi,

            Und jetzt geh ich in Deckung :P

            Solltest du nicht, im Gegenteil. Wenn der Herr wirklich mal wieder Hirn vom Himmel schmeisst, solltest du dich stark anstrengen, was zu fangen.

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. @@ChrisB:

              nuqneH

              Und jetzt geh ich in Deckung :P

              Solltest du nicht, im Gegenteil. Wenn der Herr wirklich mal wieder Hirn vom Himmel schmeisst, solltest du dich stark anstrengen, was zu fangen.

              YMMD.

              Qapla'

              --
              Volumen einer Pizza mit Radius z und Dicke a: pi z z a
      2. @@enigmartin:

        nuqneH

        das ist ja mein Problem, wie soll ich denn sonst alle ansprechen, das diese vorerst ausgeblendet werden damit dann der angeklickte im nachhinein wieder eingeblendet wird?

        http://forum.de.selfhtml.org/archiv/2009/12/t193210/#m1289813. Dortigen Links folgen.

        Qapla'

        --
        Volumen einer Pizza mit Radius z und Dicke a: pi z z a
  2. Hi,

    Ich hab mir eine simple kleine Funktion erstellt, welche ich per onclick aufrufe. Diese Funktion soll den aktiven Div ausblenden und einen neuen definierten einblenden.

    du hast hier einen der seltenen Fälle, in denen der IE korrekter ist als die Konkurrenz.

    function zeigeInhalt( ort ) {
        var text = document.getElementsByName('Inhalt');

    Sagtest du nicht, es handelt sich um div-Elemente? Pech, denn für div ist das name-Attribut in HTML nicht definiert. Da hält sich der IE sehr katholisch dran. Ergo findet er keine Elemente, und deine NodeList "text" bleibt leer.

    Selbst wenn das funktionieren würde, wäre deine Implementierung aber sehr ineffizient: Vor der Schleife speicherst du das Ergebnis von getElementsByName(), aber in der Schleife rufst du die Funktion immer wieder auf, so dass in jedem Durchlauf wieder das gesamte DOM durchsucht wird.

    document.getElementById(ort).className = 'show';

    Davon abgesehen: Warum übergibst du der Funktion die ID des gesuchten Elements als String, anstatt direkt die Referenz auf das Elements, was doch bei einem onclick-Handler naheliegend wäre? Dann könntest du dir hier den Aufruf von getElementById() sparen.

    Dann hat jeder Div eine eigene id, die mit dem Titel eines Links übereinstimmt. So wird dann über onclick="zeigeInhalt(this.title)" der richtige Inhalt angezeigt.

    Das würdest du dann umbauen auf onclick="zeigeInhalt(this)".

    Ich bräuchte nun eine kleine Hilfestellung um das auch im IE8 zum laufen zu bringen

    Verzichte in diesem Fall auf getElementsByName(). Stattdessen würde ich mit getElementById() ein übergeordnetes Containerelement selektieren, und darin mit getElementsByTagName() alle div-Elemente. Eventuell musst du sie noch anhand bestimmter Merkmale aussortieren, wenn es im Container auch noch andere divs gibt, die davon nicht betroffen sein sollen.

    So long,
     Martin

    --
    Realität ist eine Illusion, die durch Unterversorgung des Körpers mit Alkohol entstehen kann.
    1. Verzichte in diesem Fall auf getElementsByName(). Stattdessen würde ich mit getElementById() ein übergeordnetes Containerelement selektieren, und darin mit getElementsByTagName() alle div-Elemente. Eventuell musst du sie noch anhand bestimmter Merkmale aussortieren, wenn es im Container auch noch andere divs gibt, die davon nicht betroffen sein sollen.

      Ich zähle nun mit

        
      var divs = document.getElementById('Inhalte').getElementsByTagName('div').length;  
      alert( divs );  
      
      

      erstmal alle divs (nur zum test), bekomme aber mehr als ich will, da ich ja in den Divs die eingeblendet werden sollen jeweils noch ein Div habe.

      Wie kann ich das nun eingrenzen und wie ist das mit der Referentz gemeint.
      Ich bin nun leider nicht so fit in JavaScript.

      Ich versuche wirklich bestenfalls selbnst drauf zu kommen aber ich bin ein wenig überfordert.

      Valide bin übrigens ein Freund von Validität aber war im ersten Fall froh das es funktionierte dann kam der IE.

      1. Hallo enigmartin,

        ..., da ich ja in den Divs die eingeblendet werden sollen jeweils noch ein Div habe.

        Wie kann ich das nun eingrenzen und wie ist das mit der Referentz gemeint.
        Ich bin nun leider nicht so fit in JavaScript.

        du könntest über über parentNode das Elternelement ermitteln und so feststellen, ob es das richtige DIV ist.

        Ich würde aber auf Klassennamen ausweichen.

        Gruß, Jürgen

        1. Hallo enigmartin,

          ..., da ich ja in den Divs die eingeblendet werden sollen jeweils noch ein Div habe.

          Wie kann ich das nun eingrenzen und wie ist das mit der Referentz gemeint.
          Ich bin nun leider nicht so fit in JavaScript.

          du könntest über über parentNode das Elternelement ermitteln und so feststellen, ob es das richtige DIV ist.

          Ich würde aber auf Klassennamen ausweichen.

          Gruß, Jürgen

          Ich will ja am Ende einen Klassenname zum ändern der Anzeige vergeben, ja nach dem class="show" oder class="hide".

          Danke, parentNode  schaue ich mir mal an

          1. Hi,

            bitte zitiere sinnvoll, das worauf du dich konkret beziehst - und nicht einfach alles.

            Ich würde aber auf Klassennamen ausweichen.

            Ich will ja am Ende einen Klassenname zum ändern der Anzeige vergeben, ja nach dem class="show" oder class="hide".

            Ein Element kann mehr als einer Klasse angehören.

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. Hi,

              bitte zitiere sinnvoll, das worauf du dich konkret beziehst - und nicht einfach alles.

              Verzeih mir.

              Ein Element kann mehr als einer Klasse angehören.

              Ja, das weiß ich ja, nur weiß ich beim besten Willen nicht wie ich das anstellen soll.

  3. Hi,

    Ich hab mir eine simple kleine Funktion erstellt, welche ich per onclick aufrufe. Diese Funktion soll den aktiven Div ausblenden und einen neuen definierten einblenden.

    Dafür immer erst mal alle aus-, und dann einen bestimmten wieder einzublenden, ist eine unschöne Lösung.

    Wenn man sich den vorher eingeblendeten „gemerkt” hat, braucht man nur diesen einen wieder auszublenden.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]