Georg: Problem mit appendChild / removeChild /insertBefore

Beitrag lesen

Hi,

danke für die Antwort.
Zunächst ein paar Korrekturen, um Klarheit zu schaffen.

  1. Mein im ersten Posting angegebener Code hat nicht funktioniert, weil beim Sichern der Nodes in myArray[] in myArray[0] ein text-Element gespeichert wurde, welches sich später als "undefined" herausstellte (Grund noch unklar...).
    Beim Einfügen der Elemente in der letzten Schleife hat dies dazu geführt, dass die Schleife einfach verlassen wurde, als das "undefined"-Element eingefügt werden sollte. Tja, ich mag Javascript schon aus diesem Grund einfach nicht, weil man es nicht zuverlässig debuggen kann.

  2. Zweites Posting von JürgenB.: Wenn man removeChild() anwendet, übergibt man keine Nummern sondern das Knoten-Objekt selbst an die Funktion. So funktioniert es auch, mit removeChild(Array[i]) in der Schleife zu arbeiten. Übrigens bleibt der Wert nodes.length innerhalb der Schleife konstant. (dekrementiert sich also nicht automatisch)

  3. Ich behaupte, dass _kein_ CallByReference, sondern CallByValue erfolgt. Wenn CallByReference (wie von meinem Vorschreiber gesagt) verwendet würde, müsste ich Zeiger in meinem "Sicherungs-Array" haben. Das ist aber nicht der Fall, JavaScript speichert Objekte, und daher funktioniert es auch, die Objekte wieder einzufügen, obwohl sie ja vorher gelöscht wurden.

@Chritsoph:

Auf die Gefahr hin mich zu wiederholen: obiger Code dient ausschließlich pädagogischen Zwecken und kann bei unsachgemäßer Anwendung zu bleibenden Schäden führen. Dito bei sachgemäßer Anwendung.

Muss ich das verstehen? :-)

Danke für alle Eure Antworten!

Hi,

Nun bin ich einen anderen Weg gegangen und habe versucht, die Zeilen zu löschen und später in veränderter Reihenfolge neu aufzubauen. Das klappt aber auch nicht, und jetzt seid ihr zunächst gefragt, zu ermitteln, warum das nicht ohne Weiteres so möglich.

Da es jedoch ohne Weiteres möglich ist hat sich dann Deine Frage erledigt? ;-)

Aber Scherz beiseite.
Wahsaga hat Dir schon einen guten Tip gegeben, aber falls er Dir zu sehr in's Detail geht hier nochmal in der Übersicht:

Dein Problem hast Du ja schon sehr gut erkannt.

Was ich implementieren möchte ist eine funktion, um zwei Zeilen zu tauschen

Du benötigst also etwas, das man im Programmiererbereich mit Englisch als Lingua Franca für gewöhnlich "Swapping" nennt. Getauscht wird genauso gewöhnlich mittels eines temporären Speichers.

function swap(one,two){
  if(one && two){
    var temp;
    temp = one;
    one  = two;
    two  = temp;
    return true;
  }
  return false;
}


>   
> Jetzt einfach einsetzen. "Einfach"? Ja, gut, aber \_so\_ schwer ist es auch nicht. Du mußt nur wissen, was genau Du austauschen möchtest. In Deinem Fall die Zeilen (Element "tr").  
> Als Idee:  
> ~~~javascript
  

> function swapNodes(nodeOne, nodeTwo){  
>   if(nodeOne && nodeTwo){  
>     // Der Übersicht halber "Work on Copy".  
>     // Aber wirklich _nur_ der Übersicht halber.  
>     var copyOne  = document.getElementById(nodeOne);  
>     var cloneOne = copyOne.cloneNode(true);  
>   
>     var copyTwo  = document.getElementById(nodeTwo);  
>     var cloneTwo = copyTwo.cloneNode(true);  
>   
>     // Damit kann man jetzt oben beschriebenes Swapping  
>     // ausführen.  
>     copyOne.parentNode.replaceChild(cloneTwo, copyOne);  
>     copyTwo.parentNode.replaceChild(cloneOne, copyTwo);  
>   
>     return true;  
>   }  
>   return false;  
> }  
> 

Auf die Gefahr hin mich zu wiederholen: obiger Code dient ausschließlich pädagogischen Zwecken und kann bei unsachgemäßer Anwendung zu bleibenden Schäden führen. Dito bei sachgemäßer Anwendung.

Aber ich hoffe das Prinzip ist soweit klar.

so short

Christoph Zurnieden