Ich arbeite derzeit an einem Projekt, das 4 Canvas-Elemente enthält. Wenn ein Element auf ein Element klickt, wird ein Ereignis ausgelöst, das den Inhalt der Arbeitsfläche zeichnet.JavaScript Ausführung letzte EventListener auf allen Elementen
function canvasItem(cv, ctx, id){
this.cv = cv;
this.ctx = ctx;
this.id = id;
}
canvasItem.prototype.drawLine = function(){
console.log("drawing "+this.id);
}
var lineView = {
canvasItems: [],
init : function(){
items = document.getElementsByClassName("highlight");
if(items){
for(var i = 0; i<items.length; i++){
var ctx = items[i].getContext("2d");
var cv = items[i];
this.canvasItems.push(new canvasItem(cv, ctx, i));
}
}
this.addListeners();
},
addListeners : function(){
var containers = document.getElementsByClassName("articleContainer");
for(var i = 0; i<containers.length; i++){
var currentItem = this.canvasItems[i];
containers[i].addEventListener("click", currentItem.drawLine, false);
}
}
}
window.onload = function(){
lineView.init();
}
wird Jedes Canvas-Element drawing
die Ausgabe zeigen, wenn er einen Klick erhält. Ich fand heraus, dass es die Variable i=4
verwendet und die canvasItems[4].drawLine
Funktion ausführt.
Ich denke, dies könnte sein, weil es die Variable i
per Referenz in der canvasItems[i].drawLine
Linie passiert. Ich bin mir nicht sicher, ob das stimmt, aber ich hoffe, dass mir jemand zeigen kann, was ich falsch mache.
Unten ist das HTML-Muster, das vier Mal in der HTML-Seite auftritt:
<div class="articleContainer">
<article>
<h3>Title</h3>
<p>
text
</p>
</article>
<canvas class="highlight"></canvas>
</div>
Siehe http://stackoverflow.com/questions/19871627/javascript-for-loop-scope-takes-last-variable – guest271314
Danke, es mir in die richtige Richtung schubsen hat. Es löste das Schließungsproblem, jedoch weigerte sich der eventListener zu arbeiten. Ich habe es geschafft, beide Probleme zu lösen. – Tumladhir