Problem mit Element-Zugriff im Internet Explorer

CHaoSlayeR

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein Problem mit einem Skript im IE. Ich entwickle meine Skripte ersteinmal in Mozilla, da krieg ich mit dem DOM-Inspector und der JavaScript-Console nette kleine Tools die mir bei eigentlich allen Problemen helfen und geholfen haben, bis auf dieses eine Phenomen, was ich gerade krampfhaft versuche zu lösen:

in meinem Skript gibt es viele Funktionen, die sich über document.getElementsByName("name") Elemente einer bestimmten Art suchen. Alles funktioniert tadellos ohne Fehler im Mozilla, im FireFox und im Netscape.

Nun wollte ich mir mal eben die Seite im IE angucken, um noch eventuelle optimische Anpassungen vorzunehmen und siehe da, der IE findet meine Elemente nicht! Mit document.getElementById("id") geht das problemlos, allerdings mit document.getElementsByName("name") liefert er mir nur ein "[Object]" zurück, auf das ich nichtmal die Methode "length" (laut W3C und DOM liefert document.getElementsByName("name") IMMER ein Array zurück) anwenden kann, denn dann meckert er rum, dass er ein Object benötigt...

Wenn ich direkt ein Element dieser Art angebe, also über document.getElementsByName("name")[0], dann gibt er mir ein "undefined" also gar nichts zurück, aber es gibt auch kein Fehler, dass ein Solches Object nicht existieren würde.

Was kann ich da jetzt machen? Gibt es im IE Ausweichmöglichkeiten auf andere Methoden?


hier mal eine meiner Funktionen, die nicht im IE läuft:
Code:
// swapping job to close or open...
function chsSwapAuftrag(id, rowid, auftragid, dieses, anderes) {
    obj = document.getElementById(id);
    row = document.getElementById(rowid);
    auftrag = document.getElementById(auftragid);
    if(obj && row && auftrag) {
        if(obj.style.height == 'auto') {
            obj.style.height = '24px';
            row.style.height = '25px';
            auftrag.style.height = '24px';
        } else {
            obj.style.height = 'auto';
            row.style.height = xHeight(obj)+1;
            auftrag.style.height = xHeight(obj);
        }
        
        dieses.style.display='none';
        anderes.style.display='block';
    } else {
        if(!obj) alert("Object not found: " + id);
        if(!row) alert("Object not found: " + rowid);
        if(!auftrag) alert("Object not found: " + auftragid);
    }
    
    var areas = document.getElementsByName("auftragsBereich");
    var i = areas.length;
    var top = 26;
    
    for(var j=0; j<i; j++) {
        obj = document.getElementsByName("auftragsBereich")[j];
        obj2 = document.getElementsByName("auftragsLeiste")[j];
        if(obj) {
            // alert(top);
            obj.style.top = top;
            obj2.style.top = top;
            top = top + 1 + xHeight(obj);
        }
    }
}

und hier die Passage im HTML, wo die Elemente stehen, die der IE nicht finden kann:
Code:
    [ . . . ]
    <div id="auftrag_8a8198170288d0cc010288d17339003f" class="auftrag_0" name="auftragsBereich" style="top:26px; left:901px; height:26px; width:98px;" title="Baum GmbH">

        <div id="drag_8a8198170288d0cc010288d173680040" class="vorgang_0" name="vorgang_8a8198170288d0cc010288d17339003f" style="top:25px; left:-1px; width:99px; min-width:50px;" title="Peter (Peter Meier)"><table cellspacing="0" cellpadding="0" border="0" style="width:100%; height:15px;"><tr style="height:100%;"><td id="left_8a8198170288d0cc010288d173680040" name="8a8198170288d0cc010288d17339003f" style="width:12px; background:url(common/gui/arrow_small_left.gif) top left transparent; cursor:e-resize; font-size: 3px;">&nbsp;</td><td id="Res_Peter (Peter Meier)" nowrap name="Res_8a8198170288d0cc010288d173680040" style="cursor:pointer; font-size: 10px; text-align:center; vertical-align:center;" onClick="parent.dispod.location.href='Vorgang.do?dispo=true&vorgang=8a8198170288d0cc010288d173680040&auftrag_id=8a8198170288d0cc010288d17339003f'">&nbsp;</td><td id="right_8a8198170288d0cc010288d173680040" name="8a8198170288d0cc010288d17339003f" style="width:12px; background:url(common/gui/arrow_small_right.gif) top right transparent; cursor:e-resize; font-size: 3px;">&nbsp;</td></tr></table></div>

    </div>
    <div id="drag_8a8198170288d0cc010288d17339003f" name="auftragsLeiste" style="position:absolute; top:26px; left:894px; height:16px; width:114px; min-width:100px; z-index:10;">
        <table cellspacing="0" cellpadding="0" border="0" style="width:100%;"><tr>
            <td id="left_8a8198170288d0cc010288d17339003f" style="width:16px; height:16px; border:0px; cursor:w-resize; background:url(common/gui/auftrag_drag_left_back.gif) top left repeat-x transparent;"><img src="common/gui/auftrag_drag_left.gif" width="16" height="16" border="0"></td>
            <td style="height:16px; background:url(common/gui/auftrag_drag_center.gif) top left repeat-x transparent; font-size:5px; border:0px; cursor:pointer;" onClick="parent.dispod.location.href='Auftrag.do?auftrag=8a8198170288d0cc010288d17339003f'">&nbsp;</td>
            <td id="right_8a8198170288d0cc010288d17339003f" style="width:16px; height:16px; border:0px; cursor:e-resize; background:url(common/gui/auftrag_drag_right_back.gif) top left repeat-x transparent;"><img src="common/gui/auftrag_drag_right.gif" width="16" height="16" border="0"></td>
        </tr></table>
    </div>
    [ . . . ]

^ ^ bitte nicht wundern über diese Masse an Attributen. Alles wird generiert durch JSP's


angehängt zwei Bilder die das Problem optisch darstellen (das eine ist aus Mozilla >> so sollte es aussehen; das andere aus dem IE)...
 

Anhänge

  • resview_moz.gif
    resview_moz.gif
    3,5 KB · Aufrufe: 215
  • resview_ie.gif
    resview_ie.gif
    3,6 KB · Aufrufe: 173
Der IE kann das eigentlich.
Der Fehler liegt eher bei den Browsern, welche dein Skript umsetzen(und bei dir natürlich :))
....denn:
Ein <div> hat lt.HTML kein name-Attribut...wendest du die Methode im IE auf Elemente an, welche ein name-Attribut lt. HTML besitzen(a,img,input,form...usw.)... dann klappts auch im IE.

Du wirst in diesem Falls das Skript leider total umstellen und die Elemente anders ansprechen müssen :(
 
Mist, verdammt!

Du hast recht, das hätte mir auch klar sein müssen! "name" ist ja kein Universal-Attribut wie "id"...

...naja, habs eben anders gemacht: alle Elemente eines Typs (Tag-Name) holen und auf Attribut "name" überprüfen. Wenn vorhanden dann auslesen und mit meinem vergleichen. Wenn gleich, dann in ein Array mit aufnehmen. Daraus eine kleine Funktion gebastelt und schon hat sich das erledigt.

Da die Seite extrem komplex ist, was die Zugriffe auf Elemente angeht, der Inhalt sich dynamisch verändert und ich nicht immer interne Arrays halten will, wo alle Objekte drinstehen brauchte ich das "name"-Attribut dringend. Und die Gecko Engine scheint da ja etwas flexibler zu sein. Deshalb ist mir das gar nicht aufgefallen, dass das "name"-Attribut kein Universal-Dingens ist.

Naja, wie dem auch sei, jetzt hab ich's hingekriegt...
 
Hallo,
ich habe ein ähnliches Problem, aber ich versuche das Attribut (Formular) über name anzusprechen:

<script type="text/javascript">

function copy()
{
//Anzeige Extraformular
oElement = document.getElementsByName("Land")[0];

if (oElement.options[oElement.selectedIndex].value == "3")

{

//document.getElementById("Auslandsbestellung").style.display = 'none';
alert("damn right");
}

else

{

//document.getElementById("Auslandsbestellung").style.display = 'block';
alert(oElement.options[oElement.selectedIndex].value);

}
}
</script>

im body der dokuments:

<form id="email_an_uns" name="email_an_uns" method="post">
<label>
<select name="Land" size="1" onChange="copy()">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
</label>
</form>

Das Ergebnis ist:
FF: Der Alert gibt 1,2 damn right, 4 oder 5 aus
IE V.6: Der Alert gibt nichts aus (leeres feld), weil er oElement.options[oElement.selectedIndex].value nicht erkennt.

Woran könnte das liegen?
 
Das dürfte daran liegen, dass deine Optionen überhaupt keine value-Attribute besitzen.
Das, was innerhalb von <option> steht, entspricht in JS dem Attribut "text" der <option>.

Der IE machts somit richtig, würd ich sagen :)
 

Neue Beiträge

Zurück