Я начинаю с js, поэтому, пожалуйста, простите мне очевидные ошибки. Я пытаюсь воссоздать выбранный ввод с несколькими параметрами для масштабируемой разметки.Редактирование textContent или innerHTML убивает eventListener
Кратко, что я пытаюсь сделать:
- Скрыть выберите
- Создать родительский DIV с текстом первого варианта и добавить его вместо оригинального скрыт выбрать.
- Добавить eventListener при щелчке для переключения класса (он показывает и скрывает дочерние элементы)
- Создайте внутренние divs со значениями и текстом опций из оригинального скрытого выбора.
- Добавить eventListener для каждого из них, чтобы заменить значение select.
Эти несколько строк js и несколько строк css дают мне возможность выбора стиля.
// Define select and options
var select = document.getElementById('select');
var children = select.children;
// Recreate select via divs and keep same class
select.style.display = 'none';
var selectNew = document.createElement('div');
selectNew.className = select.classList;
selectNew.textContent = select.children[0].text;
select.parentNode.insertBefore(selectNew, select);
selectNew.addEventListener('click', function() {
toggleChildren();
});
function toggleChildren() {
selectNew.classList.toggle('active');
}
// remap children
var childArray = [];
for (var i = 0; i < children.length; i++) {
var child = document.createElement('div');
child.innerHTML = select.children[i].text;
child.dataset.value = select.children[i].value;
selectNew.appendChild(child);
childArray.push(child);
child.addEventListener("click", function() {
selectChoice();
});
}
function selectChoice() {
var which = childArray.indexOf(event.target || event.srcElement);
select.value = children[which].value;
// selectNew.textContent = children[which].text;
}
.select {
position: relative;
width: 100%;
line-height: 3em;
background: #eee;
}
.select > div {
position: absolute;
display: none;
width: 100%;
}
.select > div:nth-child(1) {
top: 2em;
}
.select > div:nth-child(2) {
top: 4em;
}
.select > div:nth-child(3) {
top: 6em;
}
.select > div:nth-child(4) {
top: 8em;
}
.select > div:nth-child(5) {
top: 10em;
}
.select > div:hover {
background: #eee;
}
.select.active > div {
display: block;
}
<select name="sortby" id="select" class="select">
<option value="val1">Value 1</option>
<option value="val2">Value 2</option>
<option value="val3">Value 3</option>
<option value="val4">Value 4</option>
<option value="val5">Value 5</option>
</select>
Всякий раз, когда я пытаюсь обновить текст внутри моего родительского элемента, чтобы показать текст выбранной опции через:
selectNew.textContent = children[which].text;
Он убивает ранее добавил событие Listener для этого элемента. Может кто-нибудь помочь мне понять, что я делаю неправильно? Что мне не хватает в поведении eventListeners?
Спасибо так много!Как я уже сказал, я смотрю сейчас, и это сложно с самого начала, но это весело. Это легко понять, почему этот человек не работает? 'select.addEventListener ('изменение', функция() { оповещения ('выберите изменен'); })' Спасибо так много раз –