Mabubu: replaceChild aus IFrame

Hallo Zusammen,

ich habe folgenden Fall: Ich habe eine Tabelle, die eine ID besitzt. In einem IFrame sende ich einen Request an ein CGI-Script, welches mir eine Tabelle mit der selben ID zurückliefert (im IFrame!). Zusätzlich rufe ich danach folgende Methode auf:

  
function updateElement(id) {  
	if(id) {  
		var sourceElement = document.getElementById(id);  
		var targetElement = top.document.getElementById(id);  
		if(sourceElement && targetElement) {  
			  targetElement.parentNode.replaceChild(targetElement, sourceElement);  
		}  
	}  
}  

Als ID übergebe ich die ID der Tabelle. Ich habe an verschiedenen Stellen alerts eingebaut und sourceElement sowie targetElement sind gefüllt. Aber beim Aufruf von replaceChild(..) bekomme ich die JavaScript-Fehlermeldung "Ungültiges Argument" (IE 6).

Ziel soll es sein, die Tabelle mit der neuen Tabelle aus dem IFrame zu ersetzten... Kann mir jemand erklären, was ich falsch mache?

Danke und viele Grüße!

  1. Hi,

      var sourceElement = document.getElementById(id);  
      var targetElement = top.document.getElementById(id);  
      if(sourceElement && targetElement) {  
      	  targetElement.parentNode.replaceChild(targetElement, sourceElement);  
    

    Aber beim Aufruf von replaceChild(..) bekomme ich die JavaScript-Fehlermeldung "Ungültiges Argument" (IE 6).

    Natürlich, denn du kannst in ein Dokument nur Knoten einhängen, die du auch in dessen Kontext erzeugt hast.

    Wenn du einen Knoten aus einem anderen Dokument einfügen willst - dann gibt es dafür document.importNode.
    Das kennen nur dummerweise die IE < 8 noch nicht. Da muss man sich im Zweifelsfalle dann mit innerHTML und Co. einen Workaround basteln.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Das ist ja echt blöd :(

      Wie soll ich die Tabelle denn dann austauschen? Ich habe eigentlich keine Lust um jedes Element, dass ich austauschen möchte, ein DIV zu machen und den Inhalt des DIVs auszutauschen?

      Gibt es keine andere Möglichkeit, ein Element auszutauschen? Oder kann ich die Tabelle zuerst in ein "Dummy"-DIV per innerHTML kopieren und dann mit replaceChild austauschen?

      Danke und Grüße!

      Hi,

        var sourceElement = document.getElementById(id);  
        var targetElement = top.document.getElementById(id);  
        if(sourceElement && targetElement) {  
        	  targetElement.parentNode.replaceChild(targetElement, sourceElement);  
      

      Aber beim Aufruf von replaceChild(..) bekomme ich die JavaScript-Fehlermeldung "Ungültiges Argument" (IE 6).

      Natürlich, denn du kannst in ein Dokument nur Knoten einhängen, die du auch in dessen Kontext erzeugt hast.

      Wenn du einen Knoten aus einem anderen Dokument einfügen willst - dann gibt es dafür document.importNode.
      Das kennen nur dummerweise die IE < 8 noch nicht. Da muss man sich im Zweifelsfalle dann mit innerHTML und Co. einen Workaround basteln.

      MfG ChrisB

      1. Hat niemand eine Lösung dafür?

        Das ist ja echt blöd :(

        Wie soll ich die Tabelle denn dann austauschen? Ich habe eigentlich keine Lust um jedes Element, dass ich austauschen möchte, ein DIV zu machen und den Inhalt des DIVs auszutauschen?

        Gibt es keine andere Möglichkeit, ein Element auszutauschen? Oder kann ich die Tabelle zuerst in ein "Dummy"-DIV per innerHTML kopieren und dann mit replaceChild austauschen?

        Danke und Grüße!

        Hi,

          var sourceElement = document.getElementById(id);  
          var targetElement = top.document.getElementById(id);  
          if(sourceElement && targetElement) {  
          	  targetElement.parentNode.replaceChild(targetElement, sourceElement);  
        

        Aber beim Aufruf von replaceChild(..) bekomme ich die JavaScript-Fehlermeldung "Ungültiges Argument" (IE 6).

        Natürlich, denn du kannst in ein Dokument nur Knoten einhängen, die du auch in dessen Kontext erzeugt hast.

        Wenn du einen Knoten aus einem anderen Dokument einfügen willst - dann gibt es dafür document.importNode.
        Das kennen nur dummerweise die IE < 8 noch nicht. Da muss man sich im Zweifelsfalle dann mit innerHTML und Co. einen Workaround basteln.

        MfG ChrisB

        1. @@Mabubu:

          nuqneH

          Hat niemand eine Lösung dafür?

          Unterlasse bitte:
          • Drängelpostings
          TOFU

          Qapla'

          --
          Alle Menschen sind klug. Die einen vorher, die anderen nachher. (John Steinbeck)
    2. Hi,

      ich habe die Funktion wie folgt umgeschrieben, aber es passiert nichts, außer, dass er die alte tabelle löscht :(

        
      function updateElement(id) {  
      	if(id) {  
      		var oldId = id+'__old';  
      	  
      		var sourceElement = document.getElementById(id);  
      		var targetElement = top.document.getElementById(id);  
      		  
      		if(sourceElement && targetElement) {  
      			//change id of targetElement  
      			targetElement.setAttribute('id',oldId);  
      			  
      			var ele = top.document.createElement(sourceElement.nodeName);  
      			ele.setAttribute('id',id);  
      			ele.innerHTML = sourceElement.innerHTML;  
      			  
      			targetElement.parentNode.appemdChild(ele);  
      			targetElement.parentNode.removeChild(targetElement);  
      		}  
      	}  
      }
      

      Es muss doch eine simple Möglichkeit geben, ein HTML-Element auszutauschen, oder? Was ist daran so schwierig?

      Grüße!

      Hi,

        var sourceElement = document.getElementById(id);  
        var targetElement = top.document.getElementById(id);  
        if(sourceElement && targetElement) {  
        	  targetElement.parentNode.replaceChild(targetElement, sourceElement);  
      

      Aber beim Aufruf von replaceChild(..) bekomme ich die JavaScript-Fehlermeldung "Ungültiges Argument" (IE 6).

      Natürlich, denn du kannst in ein Dokument nur Knoten einhängen, die du auch in dessen Kontext erzeugt hast.

      Wenn du einen Knoten aus einem anderen Dokument einfügen willst - dann gibt es dafür document.importNode.
      Das kennen nur dummerweise die IE < 8 noch nicht. Da muss man sich im Zweifelsfalle dann mit innerHTML und Co. einen Workaround basteln.

      MfG ChrisB

      1. Hi,

        ich habe die Funktion wie folgt umgeschrieben, aber es passiert nichts, außer, dass er die alte tabelle löscht :(

          	var ele = top.document.createElement(sourceElement.nodeName);  
          	ele.setAttribute('id',id);  
          	ele.innerHTML = sourceElement.innerHTML;  
        

        ele ist also ein TABLE-Element?
        Dann kannst du innerHTML im IE nur lesen, nicht schreiben.

        Wieso benutzt du eigentlich immer noch setAttribute, obwohl seit Jahren bekannt ist, dass auch das problematisch sein kann?

        MfG ChrisB

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