ChrisB: Workaround für IE-Bug?

Beitrag lesen

Hi,

  var source=document.getElementById("source")  
  var clone=source.cloneNode(true);  
  clone.id="clone";  
  clone.name="clone";  

  document.getElementById("main").insertBefore(clone,source);  
  alert(document.getElementById("source").id);  

Dieses Beispiel sollte eigentlich "source" ausgeben, es gibt aber beim IE "clone" aus. Wenn ich "name" im input weglasse, funktioniert es.

Der IE hat Probleme damit, das name-Attribut korrekt zu setzen bei Elementen, die bereits erzeugt sind.
document.createElement("input") und anschliessendes setzen des name-Attributes hat das gleiche Problem - dabei kann man im IE auf die Alternativ-Syntax document.createElement('<input name="..." ...>') ausweichen.

Wenn du dir mal das innerHTML von body ausgeben lässt, siehst du es:
<INPUT id=clone name=source><INPUT id=source name=source>

Dass der IE dir bei document.getElementById("source").id "clone" ausgibt liegt daran, dass er auch getElementById defekt implementiert hat - er liefert das erste Element im Dokument mit passender ID *oder* passendem Namen zurück - und das ist hier dein Klon, dessen name immer noch "source" lautet, weil der IE sich das nach der Erstellung zu ändern weigerte.

Leider habe ich dort wo ich diese Funktionalität brauche keinen Einfluss auf das name-Attribut. Kann ich den Bug trotzdem irgendwie umgehen, so dass ein getElementById das richtige Element zurückgibt?

Musst du "Klonen" - reicht ein eigenhändiges Neu-Erstellen des Elementes nicht? Dabei könntest du die erwähnte Alternativ-Syntax nutzen.

Ansonsten kannst du auch nach dem Einhängen des Klons ins Dokument (vorher hat in meinem Test nicht die gewünschte Wirkung) ihm sein eigenes outerHTML noch mal zuweisen, mit geändertem name:
clone.outerHTML = clone.outerHTML.replace(/name=source/, "name=clone");

Da solltest du aber etwas ausführlicher testen, ob dir das nichts anderes kaputt macht - wie ggf. Eventhandler, die ans Element gebunden wurden, o.ä.

Btw., ich habe das ganze mittels IETester im IE 7 getestet; im darin enthaltenen 8er war dein Beispiel schon gar nicht erst lauffähig - was natürlich am IETester selber liegen kann. Aber wenn du es im 8er noch nicht getestet hast, solltest du das auch noch machen.

MfG ChrisB

--
Light travels faster than sound - that's why most people appear bright until you hear them speak.