2016-12-23 4 views
-1

Ich versuche, eine Konstruktorfunktion mit einer Methode zu schreiben, die eine Reihe von Zeilen (numerisches Argument) durchläuft, und für jede der einzelnen Zeilen dann eine Schleife über mehrere Punkte (numerisches Argument)). In jeder der beiden Schleifen wird ein Teil von html gerendert. Ich kann den ersten Teil html zum Rendern bekommen, aber wenn ich versuche, den zweiten Teil mit einem Selektor vom zuvor gerenderten HTML zu durchlaufen, passiert nichts. Was vermisse ich ?JavaScript - Iterate über dynamisch HTML erstellen

HTML CODE

<div class="container"> 
    <h1 class="heading">Random Colors</h1> 
    <div class="row"> 
     <div id="frame" class="col-xs-12"> 
      <!-- CONTENT PUSHED BY JAVASCRIPT -->  
     </div> 
    </div><!-- Ends .row --> 
</div><!-- Ends .container --> 

JavaScript-Code

var ColorDots = function(rows, dots) { 
    this.numOfRows = rows; 
    this.numOfDots = dots; 
    this.renderDots(); 

}; 

ColorDots.prototype.renderDots = function() { 

    this.rowTemplate = '<div class="color-dot row"></div>'; 
    this.iconTemplate = '<i class="fa fa-circle icon" aria-hidden="true"></i>';  

    for (var r = 0; r < this.numOfRows; r++) { 

     document.getElementById('frame').innerHTML += this.rowTemplate; 

     for (var i = 0; i < this.numOfDots; i++) { 

      document.getElementsByClassName('color-dot').innerHTML += this.iconTemplate; 
     }    
    }  
}; 

SOLUTION (Javascript nur)

var ColorDots = function(rows, dots) { 

     // Properties 
     this.numOfDots = dots; 
     this.numOfRows = rows || 1; 
     this.iconHtml = '<i class="fa fa-circle icon" aria-hidden="true"></i>'; 

     this.renderRows(); 

    };  

    ColorDots.prototype.renderRows = function() { 

     this.rowHtml = ''; 

     for (var r = 0; r < this.numOfRows; r++) { 

      this.rowHtml += '<div class="color-dot row">'; 

      for (var i = 0; i < this.numOfDots; i++) {    
       this.rowHtml += this.iconHtml; 
      } 

      this.rowHtml += '</div>'; 
     } 

     document.getElementById('frame').innerHTML = this.rowHtml; 

}; 

T Hank you @rainerh für die Antwort auf meine Frage. Wie auch immer, nachdem ich überlegt habe, was @shilly im Kommentar bezüglich der Verwendung von .innerHTML innerhalb von for-Schleifen gesagt hat, habe ich einige Änderungen an meinem Code vorgenommen, um seinen Vorschlag zu reflektieren. Hoffentlich wird dies für andere nützlich sein, die versuchen, etwas Ähnliches zu tun.

+3

'getElementsByClassName' gibt ein Array von Elementen zurück. Also 'innerHTML' wird nicht funktionieren. Sie müssen die Elemente durchlaufen, die Sie zurückgegeben haben. – Tyr

+1

Hinweis: Versuchen Sie, innerHTML in einer Schleife zu setzen. Füge alle Elemente an eine Zeichenkette an und führe eine innereHTML-Datei aus, sobald die Zeichenkette vollständig ist. Dies erhöht drastisch die Renderzeit, die Sie zu vielen Zeilen bekommen. – Shilly

+0

@Shilly, vielen Dank für die Beratung Ich habe ein überarbeitetes Codebeispiel zu der Frage hinzugefügt, die Ihren Kommentar widerspiegelt und natürlich funktioniert es gut für meine Bedürfnisse. –

Antwort

2

Zuerst ist die CSS-Klasse ein Farbpunkt und keine Farbpunkte, wie Sie es in Ihrem Selektor haben.

Zweitens gibt getElementsByCLassName ein Array zurück. Also muss hier ein Index verwendet werden.

ColorDots.prototype.renderDots = function() { 
    this.rowTemplate = '<div class="color-dot row"></div>'; 
    this.iconTemplate = '<i class="fa fa-circle icon" aria-hidden="true"></i>';  

    for (var r = 0; r < this.numOfRows; r++) { 

    document.getElementById('frame').innerHTML += this.rowTemplate; 
    for (var i = 0; i < this.numOfDots; i++) { 
     document.getElementsByClassName('color-dots')[r].innerHTML += this.iconTemplate; 
    }    
    }  
}; 
+0

danke, ich wusste, ich müsste irgendwann über die Sammlung iterieren, ich habe mich nur verwirrt, wann, wo und wie. Ihr Vorschlag war sehr hilfreich. –