Как создать множество одинаковых элементов?
Есть ul в нем три li. У li одинаковые классы и label, input тоже все одинаковое меняются только значение в атрибутах name, for, id, type
<ul class="elem">
<li class="item">
<label class="elem__label" for="elemName"></label>
<input type="text" class="elem__input" id="elemName"/>
</li>
<li class="item">
<label class="elem__label" for="elemTel"></label>
<input type="tel" class="elem__input" id="elemTel"/>
</li>
<li class="item">
<label class="elem__label" for="elemMask"></label>
<input type="text" class="elem__input" id="elemMask"/>
</li>
</ul>
У li,label,input классы одинаковые. Можно ли как-то создать эти элементы li с label и input динамически не используя innerHTML и цыкла for. Опять же, из-за того что классы у этих элементов одинаковые не получается сделать через const |
Цитата:
Цитата:
Цитата:
Вот пример...
<ul class="elem"></ul>
<script>
function createListItemWithInputAndLabel({ name = "", label = "", type = "text" }) {
var item = document.createElement("li");
item.className = "item";
var htmlLabel = document.createElement("label");
htmlLabel.className = "elem__label";
htmlLabel.textContent = label;
htmlLabel.addEventListener("click", () => input.focus());
item.appendChild(htmlLabel);
var input = document.createElement("input");
input.className = "elem__input";
input.type = type;
input.name = name;
item.appendChild(input);
return item;
}
var data = [{
label: "Name"
}, {
label: "Phone",
type: "tel"
}, {
label: "Mask"
}];
var unorderedList = document.querySelector("ul.elem");
data.map(createListItemWithInputAndLabel).forEach(item => {
unorderedList.appendChild(item);
});
</script>
<!-- Далее ненужные стили, просто чтобы было похоже на форму -->
<style>
ul.elem {
padding: 0;
}
li.item {
display: grid;
margin: 0.5em 0;
}
</style>
Цитата:
Цитата:
|
Цитата:
Если предполагается ее модификация - нужно использовать let. |
Цитата:
|
Вот использовал let. Тоже ошибка что элемент уже обьвлен. Точно так же если я использую const
let formItem = document.createElement("div")
formItem.classList.add("form__item");
let formLabel = document.createElement("label")
formLabel.classList.add("form__label")
formLabel.setAttribute("for", "formName")
formLabel.textContent = "Ваше имя*:"
let formInput = document.createElement("input")
formInput.classList.add("form__input")
formInput.setAttribute("id", "formName")
formInput.setAttribute("type", "text")
formInput.setAttribute("name", "name")
let formError = document.createElement("span")
formError.classList.add("form__error")
[QUOTE] //? На let тоже не работает выдает ошибку что индентификатор formItem уже обьявлен [/QUOTE]
let formItem = document.createElement("div")
formItem.classList.add("form__item");
let formLabel = document.createElement("label")
formLabel.classList.add("form__label")
formLabel.setAttribute("for", "formTelephon")
formLabel.textContent = "Укажите телефон*:"
let formInput = document.createElement("input")
formInput.classList.add("form__input")
formInput.setAttribute("id", "formTelephon")
formInput.setAttribute("type", "tel")
formInput.setAttribute("name", "telephon")
let formError = document.createElement("span")
formError.classList.add("form__error")
|
Я let тоже так пробывал, они повторяются и дает ошибку "индентификатор formItem уже обьявлен"
|
Цитата:
Прежде чем писать на каком-то ЯП нужно почитать хотя бы его основы. https://learn.javascript.ru В противном случае будешь "спотыкаться" на "каждом шагу"... |
... я знаю это, это просто пример что классы одинаковые и элементы, а разные только значение атрибутов
|
Цитата:
Цитата:
Вам нужно создать функцию, которая будет создавать очередной элемент списка с ярлыком и текстовым полем. Вызвав такую функцию определённое количество раз, вы получите точно такое же количество элементов списка. Почему вам запрещено извлечь данные в отдельную структуру, например так...
[{
htmlFor: "formName",
labelText: "Ваше имя*:",
inputType: "text",
inputName: "name"
}, {
htmlFor: "formTelephon",
labelText: "Укажите телефон*:",
inputType: "tel",
inputName: "telephon"
}]
... и затем вот эти данные передать в функцию, которая создаёт label и input с его родительским элементом? |
В качестве примера :-)
<div id="test"></div>
<script>
const buildElement = (tagName, props = {}, attributes = {}) => {
const el = Object.assign(document.createElement(tagName), props);
for (let key in attributes) el.setAttribute(key, attributes[key]);
return el;
}
const label = buildElement('label', {
className: 'form__label',
innerText: 'Best Label',
}, {
for: "formName",
onclick: "alert(this.tagName)"
});
test.insertAdjacentHTML('beforeend', label.outerHTML)
</script>
|
| Часовой пояс GMT +3, время: 21:13. |