2017-03-28 2 views
0

ich eine einfache Klasse, die ein übergeordnetes Element hat, und i speichern, es ist untergeordnetes Element Fortschritt, aber wenn ich auf das Kind Element nichts hinzufügen geschiehtDOM-Objekt nicht referenziert

class MyClass { 
    constructor(element) { 
    this.elem = element; 
    this.child = this.elem('.child'); 
    this.fill(); 
    } 
    fill() { 
    this.elem.innerHTML += '<span class="child2"></span>'; 
    } 
    update(val) { 
    this.child.style.width = val + '%'; 
    } 
} 

Wenn ich die Update-Funktion nichts nennen das passiert. Wenn ich das Kindelement drucke, sehe ich, dass es einen Stil von val% hat, aber ich sehe es nicht im DOM "update".

Es ist wie es das Objekt kopiert und die Referenz nicht speichert.

BTW: Funktioniert auch dies ok this.elem.querySelector('.child').style.width = val + '%';

auch versucht, mit children[0] wird auch nicht funktionieren.

Vielen Dank im Voraus!

+0

Verwenden Sie irgendwo "innerHTML" in Ihrem Code? Und es würde helfen, uns Ihr Markup zu zeigen. Das klingt für mich wie das Problem, das Anfänger bei der Verwendung von 'node.innerHTML + =' haben. – Thomas

+0

Haben Sie den Wert von this.ch in der Update-Funktion überprüft? –

+0

Nein, ich kopiere das Markup nicht, ich arbeite nur mit dem DOM. Markup ist einfach: '

' – Maverick

Antwort

1

Ein einfaches Dienstprogramm, das Markup in ein DocumentFragment umwandelt.

var dummy = document.createElement('div'); 
function fromHTML(markup){ 
    dummy.innerHTML = markup; 
    for(var frag = document.createDocumentFragment(), fc; fc = dummy.firstChild;) 
     frag.appendChild(fc); 
    return frag; 
} 

so statt node.innerHTML += someMarkup; besser node.appendChild(fromHTML(someMarkup))

in Ihrem Fall

fill() { 
    this.elem.appendChild(fromHTML('<span class="child2"></span>')); 
} 

oder in diesem einfachen Fall zu vermeiden, dass das Auszeichnungsüberhaupt:

fill() { 
    var child = document.createElement('span'); 
    child.className = "child2"; //avoid enumerated classes/valriables/everything 
    this.elem.appendChild(child); 
} 
+0

Ich sah wirklich nicht die Funktion den Start hinzufügen .. Wenn ich InnerHTML Suche ich fand es .. Danke für die Funktion, aber die Markup ist einfach, so werde ich benutze einfach 'createElement' und' appendChild'. Danke, dass du mir geblieben bist !!! – Maverick

1

Als Kommentator sagte, dies ist wahrscheinlich mit der Verwendung von .innerHTML auf einem paren verbunden t Knoten oder der Knoten selbst. Der Grund dafür ist, wenn Sie .innerHTML verwenden, ändert JavaScript das DOM und "baut" es innerhalb des Knotens innerHTML um. Dadurch werden alle vorhandenen Handles für die vorhandenen Knoten freigegeben. Dies bedeutet, dass alle Listener und Referenzen verloren gehen, wenn Sie das innerHTML aktualisieren.

In Betracht ziehen, anstatt die innereHTML zu bearbeiten, und das wird Ihr Problem lösen.

Verwandte Themen