У меня множество компаний:
var list = ["company1", "company2", "company3", "company4", "company5", "company6"];
И я хочу пройтись по массиву и добавить список компаний в дом группами по три. Как это:
<div class = "row">
<div class = "col col-4">Company 1</div>
<div class = "col col-4">Company 2</div>
<div class = "col col-4">Company 3</div>
</div>
<div class = "row">
<div class = "col col-4">Company 4</div>
<div class = "col col-4">Company 5</div>
<div class = "col col-4">Company 6</div>
</div>
<div class = "row">
<div class = "col col-4">Company 7</div>
<div class = "col col-4">Company 8</div>
<div class = "col col-4">Company 9</div>
</div>
^ так что это была бы идеальная разметка, которая создается после зацикливания массива. В идеале я хочу создать пустой шаблон разметки - затем прочитать из этого шаблона, а затем создать разметку в js
Мой код:
var list = ["company1", "company2", "company3", "company4", "company5", "company6"];
var itemWrapper = $('.wrapper');
var itemRow = itemWrapper.find('.row');
var itemCol = itemRow.find('.col').eq(0);
console.info("itemRow", itemRow);
console.info("itemCol", itemCol);
itemWrapper.empty();
$.each(list, function(index, value) {
console.info("index", index);
console.info("value", value);
if (index % 3 == 0) {
console.info("-------new row");
$('.wrapper').append('<div class = "row">');
}
$('.wrapper').append(itemCol.html(value));
if (index % 3 == 0) {
//$('.wrapper').append('</div>');
console.info("-------end row");
}
});
/*
if (index % 3 == 0) {
console.info("new row");
modalWindow.partyContainer.append('<div class = "row party-list">');
}
console.info("modalWindow.itemRow", modalWindow.itemRow);
var itemCol = $(modalWindow.itemRow).html(value.name);
modalWindow.partyContainer.append(itemCol);
if (index + 3 % 3 == 0) {
console.info("end row");
modalWindow.partyContainer.append('</div>');
}
if (index == 12) {
return false;
}
*/<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "wrapper">
<div class = "row">
<div class = "col col-4">x</div>
<div class = "col col-4">c</div>
<div class = "col col-4">v</div>
</div>
</div>Проблема, с которой вы столкнулись, по-видимому, заключается в том, что вы пытаетесь обрабатывать добавление в дом так, как будто вы создаете разметку. Ты не. Когда вы добавляете элементы в дом, вы создаете элементы документа. У элемента нет открывающего или закрывающего тега. Это просто объект. HTML используется как язык описания, чтобы сообщить браузеру, где начинается и где останавливается элемент. Когда вы добавляете напрямую в дом, вы не можете разбить эти операторы. Если вы добавите «<div>», будет создан элемент div. Не ждет / не требует закрытия </div>
- так добавить голову / хвост как var?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Просто добавьте новую строку с помощью jQuery, если остаток равен 0, и соответственно добавьте <div>.
var list = ["company1", "company2", "company3", "company4", "company5", "company6"];
var itemWrapper = $('.wrapper');
itemWrapper.empty();
list.forEach(function(row, idx) {
if (!(idx % 3)) {
itemWrapper.append('<div class = "row"></div');
}
var itemRow = $('.wrapper .row:last-child');
itemRow.append('<div class = "col col-4">'+row+'</div>');
});<script src = "https://code.jquery.com/jquery-3.2.1.js"></script>
<div class = "wrapper">
</div>Дайте знать, если у вас появятся вопросы. Надеюсь это поможет.
- это хорошо - но это не читается из созданной разметки - потому что вы добавляете классы и разметку в js
Просто используйте переменную $row, которая будет содержать текущий элемент строки. Обновите эту переменную для каждых трех элементов новым элементом строки. И для каждого элемента просто добавьте в $row:
var list = ["company1", "company2", "company3", "company4", "company5", "company6", "company7"];
var $wrapper = $('.wrapper');
$wrapper.empty();
var $row; // the current row of elements
$.each(list, function(index, value) {
if (index % 3 == 0) { // for every three elements
$row = $('<div class = "row"></div>').appendTo($wrapper); // create a new row element and assign it to $row
}
$row.append('<div class = "col col-4">' + value + '</div>'); // add the current element to the current row
});.row { margin: 10px 0; background: #eee; }
.row > * { display: inline-block; margin: 0 10px; }<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "wrapper"></div>Вы можете использовать array.slice, чтобы разделить массив за вас и перебирать фрагменты, как в моем примере.
Есть ли конкретная причина, по которой вы хотите использовать существующий HTML в качестве шаблона?
var list = ["company1", "company2", "company3", "company4", "company5", "company6", "company7", "company8", "company9", "company10"];
var itemWrapper = $('.wrapper');
var listChunks = [];
var chunkSize = 3;
for (var i = 0; i < list.length; i += chunkSize) {
listChunks.push(list.slice(i,i+chunkSize));
}
itemWrapper.empty();
var rowHtmlOpen = '<div class = "row">';
var rowHtmlClose = '</div>';
listChunks.forEach(function (chunk) {
var rowHtml = rowHtmlOpen;
chunk.forEach(function (col) {
rowHtml += '<div class = "col col-4">' + col + '</div>'
});
rowHtml += rowHtmlClose;
itemWrapper.append(rowHtml);
});.row { margin: 10px 0; background: #ffe; }
.row > * { display: inline-block; margin: 0 10px; }<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "wrapper"></div>var list = ["company1", "company2", "company3", "company4", "company5", "company6"];
var wrapper = $('.wrapper');
var row = {};
$.each(list,function(key,val){
if ((key % 3) == 0){
row = $('<div>', {'class' : 'row'});
wrapper.append(row);
}
var col = $('<div>', {'class' : 'col col-4'});
col.text(val);
row.append(col);
});
Вот версия, в которой используется только javascript. Логика получает столбец и удаляет его из DOM, так что его текст можно изменять, не влияя каждый раз на DOM. Затем он создает строку с HTML-кодом, который должен занять место содержимого оболочки. В самом конце он заменяет содержимое обертки всем результатом. Построение html, а не элементов, устраняет некоторые накладные расходы, а изменение оболочки в самом конце ограничивает количество изменений DOM, оба из которых являются приростом производительности.
Обновлено: внесена небольшая модификация. Я добавил дополнительное название компании, чтобы массив не делился на 3 без остатка, а затем изменил логику закрытия, добавив, независимо от того, является ли элемент последним, поэтому html всегда правильно закрывается.
var list = ["company1", "company2", "company3",
"company4", "company5", "company6",
"company7"];
var itemWrapper = document.querySelector('.wrapper');
var itemColumn = itemWrapper.querySelector('.col');
var output = '';
itemColumn.parentNode.removeChild(itemColumn);
list.forEach(function(company, index){
if (index % 3 === 0) output += '<div class = "row">';
itemColumn.innerText = company;
output += itemColumn.outerHTML;
if (++index % 3 === 0 || index === list.length) output += '</div>';
});
itemWrapper.innerHTML = output;<div class = "wrapper">
<div class = "row">
<div class = "col col-4">x</div>
<div class = "col col-4">c</div>
<div class = "col col-4">v</div>
</div>
</div>
Вы можете разбить массив на куски из 3 и пропустить его.