steffen: Inhalt eines Knotens kopieren

Hallo Helfer,

ich hab mal wieder ein problem, bei dem ich nicht weiterkomme.

Ich habe eine Tabelle:

<html>  
 <tr>  
  <td>Text<input type="text">Text2</td>  
 <tr>  
<html>

Nun möchte ich in diesem td-Tag ein div rumlegen also so:

<td><div>Text<input type="text"><p>Text2</p></div></td>

Bisher sind alle meine Versuche gescheitert ...

Probiert habe ich in etwa folgendes:

var table = document.getElementsByTagName("table");  
var tr = table[0].getElementsByTagName("tr");  
var td = tr[0].getElementsByTagName("tr");  
  
var child_div = document.createElement("div");  
for(var i=0; i<td.childNodes.length; i++){  
 child_div.appendChild(td.childNodes[i]);  
}  

Klappt eigentlich ganz gut, nur das "Text" kein Knoten ist.

Kann mir bitte jemand sagen, was ich falsch mache? :(

lg steffen

  1. Nun möchte ich in diesem td-Tag ein div rumlegen also so:

    Bevor wir uns den Kopf zerbrechen, warum willst du das?

    Struppi.

    1. Hallo Struppi,

      puh ist ne längere Geschichte. Möchte auf das Div ein paar style elemente setzen, die nicht auf das td darf, weil es sonst nicht klappt, was ich vorhabe.

      Ich weiß eine ziemlich unbefriedigende Antwort ... versuche gerade eine Lösung zu finden eine Scroll Table zu machen, die auch wirklich funktioniert (IE + FF) und auch die Abstände zwischen fixed und scroll gleich sind, ohne irgendwelche Werte auszulesen.

      Nun fehlt mir noch dieser letzte Schritt ...

      Hoffe du weißt weiter.

      Achja hab schon versucht ein cloneNode zu nutzen, aber das würde nichts bringen, weil die <td> mitgeklont wird und zudem schmiert mir einfach der Browser ab bei diesem versuch.

      mfg

      1. Ich weiß eine ziemlich unbefriedigende Antwort ... versuche gerade eine Lösung zu finden eine Scroll Table zu machen, die auch wirklich funktioniert (IE + FF) und auch die Abstände zwischen fixed und scroll gleich sind, ohne irgendwelche Werte auszulesen.

        Javascript funktioniert NIE wirklich.

        Du suchst im übrigen.
        ob.innerHtml = '<wrapper>'+ob.innerHtml+'</wrapper>';

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische
  2. Ich habe eine Tabelle:

    Wissen wir.

    <html>

    <tr>
      <td>Text<input type="text">Text2</td>
    <tr>
    <html>

    
    >   
    > Nun möchte ich in diesem td-Tag ein div rumlegen also so:  
    >   
    > `<td><div>Text<input type="text"><p>Text2</p></div></td>`{:.language-html}  
    >   
    > Bisher sind alle meine Versuche gescheitert ...  
    >   
    > Probiert habe ich in etwa folgendes:  
    >   
    > ~~~javascript
    
    var table = document.getElementsByTagName("table");  
    
    > var tr = table[0].getElementsByTagName("tr");  
    > var td = tr[0].getElementsByTagName("tr");  
      
    ----------------------------------------^^  
      
    
    > var child_div = document.createElement("div");  
    > for(var i=0; i<td.childNodes.length; i++){  
      
    td wäre, wenn es definiert wäre, eine Collection von tds, kein einzelnes Element.  
      
    
    >  child_div.appendChild(td.childNodes[i]);  
      
    Du versuchtst, eine Methode auf eine eine Collection anzuwenden.  
      
    
    > }  
    > 
    
    

    Klappt eigentlich ganz gut, nur das "Text" kein Knoten ist.

    erstaunt mich / nicht.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Hi,

      var child_div = document.createElement("div");
      for(var i=0; i<td.childNodes.length; i++){

      td wäre, wenn es definiert wäre, eine Collection von tds, kein einzelnes Element.

      child_div.appendChild(td.childNodes[i]);

      Du versuchtst, eine Methode auf eine eine Collection anzuwenden.

      Gut beobachtet.

      Davon abgesehen sollte man noch die Problematik im Auge behalten, dass der IE childNodes nicht korrekt umsetzt, was Whitespace-Textknoten zwischen Elementen angeht. Das muss sich, je nach vorliegendem DOM, nicht auswirken, kann aber.

      Wenn es sich um keine allzu aufwendige Aktion handelt (wenige Kindknoten/einmalige Anwendung), sollte man also besser etwas in der Art nutzen:

      while(altesElement.firstChild) {  
        neuesElement.appendChild(altesElement.firstChild);  
      }
      

      Damit erwischt man auf jeden Fall alle Kindknoten.

      Natürlich ist dieses „stückweise“ Umhängen von Knoten relativ langsam.
      Sollte das also in größerem Umfang erfolgen sollen, so tut man gut daran, das ganze nicht „live“ im DOM zu machen, sondern mit einem noch nicht im DOM hängenden Element zu arbeiten, bzw. ggf. das zu bearbeitende erst aus dem DOM rauszunehmen (removeChild). Auch die Nuztung eines DocumentFragment kann sich bezahlt machen, wenn man in größerem Stil DOM-Manipulationen durchführt.

      MfG ChrisB

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