2016-09-24 5 views
2

Bitte beachten Sie, den kleinen folgenden Code:Wrapped klickbare DivElement: Ereignis wird nicht zugehört

function Movable(x, y, width, height, background_color) { 
    this.html_element = document.createElement("div"); 

    this.html_element.onclick = this.move; 
    this.move = function() { 
     alert("Clicked !"); 
    }; 

    this.display = function() { 
     document.body.innerHTML += this.html_element.outerHTML; 
    }; 
} 

Ich versuche, das HTML-Attribut "Onclick" mit hinzuzufügen "move();" als Wert. Dieser move Wert ist tatsächlich eine Funktion, die "Clicked!" wenn der Endbenutzer auf dieses HTML-Element klickt.

Aber es funktioniert nicht. Wenn ich die Quelle überprüfe, scheint es, dass die Eigenschaft onclick diesem HTML-Element nicht hinzugefügt wird.

Wissen Sie, warum und wie ich dieses Problem lösen könnte?

Antwort

7

document.body.innerHTML += this.html_element.outerHTML; ist das Problem. Das ist nur der schlechteste Weg, ein Element zu einer Seite hinzuzufügen.

Ihr Handler hat nichts mit HTML zu tun, daher geht er verloren, wenn Sie das Element mit dem Aufruf outerHTML in HTML serialisieren. Nicht zu erwähnen, dass Sie alle die Knoten unter dem document.body serialisieren und zerstören, und sie dann in neue Knoten zurück verwandeln, die sie Handler und andere Daten auch verlieren lassen.

Stattdessen tun nur .appendChild() verwenden, um den Knoten Element hinzufügen:

document.body.appendChild(this.html_element) 

Auch sind Sie this.move als Handler vor zuweisen Sie es schaffen, die undefined nur vergeben werden, es sei denn es eine Movable.prototype.move mit einem ist Handler.

function Movable(x, y, width, height, background_color) { 
    this.html_element = document.createElement("div"); 

    this.move = function() { 
     alert("Clicked !"); 
    }; 

    this.html_element.onclick = this.move; 

    this.display = function() { 
     document.body.appendChild(this.html_element); 
    }; 
} 
+0

Vielen Dank! Weißt du, warum ich nicht auf die Eigenschaft 'style' innerhalb der Funktion' move' zugreifen kann? =/ –

+0

@ Lern-X: 'this.style' sollte Dir diese Eigenschaft geben, also wird' this.style.display = "none" 'zum Beispiel das Element verstecken. –

+0

Oh, du meinst * deine * Anzeigefunktion. Das liegt daran, dass der Wert von "this" das Element und nicht Ihr Objekt ist. Dies ist ein häufiges Problem, und Sie werden viele verschiedene Lösungen finden, wenn Sie suchen. Ein Ansatz, den ich mag, ist die Verwendung der 'EventListener'-Schnittstelle. Aber es gibt auch andere Ansätze. –