Отображение элемента в зависимости от выбора select
Доброго времени суток.
Имеем такую HTML структуру: <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Первая опция </option> <option value="two"> Вторая опция </option> <option value="three" selected="selected"> Третья опция </option> </select> <hr> <div id="hidden_div1" style="display:none;">Для первого селекта</div> <div id="hidden_div2" style="display:none;">Для второго селекта</div> <div id="hidden_div3" style="display:none;">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div> Задача чтобы в зависимости от выбора опции селекта отображался нужный блок, реализуем с помощью JS: document.getElementById('main').addEventListener('change', function () { var style = this.value == "one" ? 'display' : 'none'; document.getElementById('hidden_div1').style.display = style; var style = this.value == "two" ? 'display' : 'none'; document.getElementById('hidden_div2').style.display = style; var style = this.value == "three" ? 'display' : 'none'; document.getElementById('hidden_div3').style.display = style; }); Вот этот же код в песочнице - https://jsfiddle.net/alexodiy/904597e7/17/ По умолчанию у нас выбрана 3 опция. Как сделать так, чтобы скрипт отрабатывал вывод блока во время загрузки или после загрузки страницы? |
Alexodiy,
а можно классы вместо style? |
Можно классы, если проще будет, главное что в зависимости от выбранной опции, а опция может быть выбрана другая и их может быть больше, там с пхп связано, но отображать или нет тут на помощь js приходит
|
Alexodiy,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .hide{ display:none; } .hide.show{ display: block; } </style> <script> window.addEventListener('DOMContentLoaded', function() { var select = document.querySelector('#main'), hide = document.querySelectorAll('.hide'); function change() { [].forEach.call(hide, function(el) { var add = el.classList.contains(select.value) ? "add" : "remove" el.classList[add]('show'); }); } select.addEventListener('change', change); change() }); </script> </head> <body> <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Первая опция </option> <option value="two"> Вторая опция </option> <option value="three" selected="selected"> Третья опция </option> </select> <hr> <div class="hide one">Для первого селекта</div> <div class="hide two">Для второго селекта</div> <div class="hide three">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div> </body> </html> |
Спасибо огромное.
|
А вы можете еще подсказать? Если например мы имеем аналогичную ситуацию, только вместо блоков мы имеем input
<select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Отметить все </option> <option value="two"> Выбрать несколько </option> </select> <hr> <label><input type="checkbox"/> описание 1</label> <br> <label><input type="checkbox" checked disabled /> описание 2</label> <br> <label><input type="checkbox" /> описание 3</label> <br> <label><input type="checkbox" /> описание 4</label> Вот в песочнице https://jsfiddle.net/0wa9tyet/2/ Как сделать так, что при выборе селекта с опцией Отметить все, у нас ко всем инпутам добавлялось checked + disabled, а при выборе Выбрать несколько чекбоксы становились пустыми без checked и disabled |
Alexodiy,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> <script> window.addEventListener('DOMContentLoaded', function() { var select = document.querySelector('#main'), hide = document.querySelectorAll('[type="checkbox"]'); function change() { [].forEach.call(hide, function(el) { el.removeAttribute('disabled'); el.checked = false; if(select.value == 'one') { el.checked = true; el.setAttribute('disabled', 'disabled'); } }); } select.addEventListener('change', change); change() }); </script> </head> <body> <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Отметить все </option> <option value="two"> Выбрать несколько </option> </select> <hr> <label><input type="checkbox"/> описание 1</label> <br> <label><input type="checkbox" checked disabled /> описание 2</label> <br> <label><input type="checkbox" /> описание 3</label> <br> <label><input type="checkbox" /> описание 4</label> </body> </html> |
Ясность полная, но в форме много <input type="checkbox" />, как сделать для определенной группы, ато в форме все инпуты выделятся начинают
|
Alexodiy,
придумать класс для инутов hide = document.querySelectorAll('.Ваш_класс'); или обернуть их одним элементом с классом и тогда hide = document.querySelectorAll('.Ваш_класс input'); |
Цитата:
|
localStorage remember the index
Kramer778,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .hide { display: none; } .hide.show { display: block; } </style> <script> document.addEventListener('DOMContentLoaded', function() { let select = document.querySelector('#main'), hide = document.querySelectorAll('.hide'); let index = localStorage.show == undefined ? select.selectedIndex : localStorage.show; function change() { let div = document.querySelector('.hide.show'); if (div) div.classList.remove('show'); index = localStorage.show = select.selectedIndex; hide[index].classList.add('show') } select.addEventListener('change', change); hide[index].classList.add('show'); select.options[index].selected = true; }); </script> </head> <body> <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Первая опция </option> <option value="two"> Вторая опция </option> <option value="three" selected="selected"> Третья опция </option> </select> <hr> <div class="hide one">Для первого селекта</div> <div class="hide two">Для второго селекта</div> <div class="hide three">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div> </body> </html> |
Спасибо огромное!
Цитата:
|
Kramer778,
копировать сообщения целиком не обязательно, это засоряет тему, и есть цитирование. |
Хорошо, буду знать :)
Еще вопрос, а можно ли эти селекты дополнительно вывести в произвольном месте шаблона и чтобы они были взаимосвязаны и отображали содержимое выбора? Например выводим селекты в подвале: <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Первая опция </option> <option value="two"> Вторая опция </option> <option value="three" selected="selected"> Третья опция </option> </select> Возможно ли сделать, чтобы при выборе например "Вторая опция", выводилось "Для второго селекта" в изначальном месте и соответственно селект в изначальном месте тоже менялся на "Вторая опция"? |
synchronous selects
Kramer778,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .hide { display: none; } .hide.show { display: block; } </style> <script> document.addEventListener('DOMContentLoaded', function() { let select = document.querySelectorAll('.main_field'), hide = document.querySelectorAll('.hide'); let index = localStorage.show == undefined ? select[0].selectedIndex : localStorage.show; function change() { index = localStorage.show = this.selectedIndex; show(index); } function show(index) { let div = document.querySelector('.hide.show'); if (div) div.classList.remove('show'); hide[index].classList.add('show'); select.forEach(s => s.options[index].selected = true) } select.forEach(s => s.addEventListener('change', change)); show(index); }); </script> </head> <body> <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Первая опция </option> <option value="two"> Вторая опция </option> <option value="three" selected="selected"> Третья опция </option> </select> <hr> <div class="hide one">Для первого селекта</div> <div class="hide two">Для второго селекта</div> <div class="hide three">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div> <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Первая опция </option> <option value="two"> Вторая опция </option> <option value="three" selected="selected"> Третья опция </option> </select> </body> </html> |
Гениально! Вы просто Мастер!
Только у меня возникла следующая проблема. Хотел от обратного продублировать и вывести получаемый контент в произвольном месте. <div class="hide one">Для первого селекта</div> <div class="hide two">Для второго селекта</div> <div class="hide three">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div> Но из-за того, что в стилях стоит .hide { display: none;}дивы не отображаются. Случайно не знаете как можно решить данную задачу? |
Kramer778,
не понимаю. |
Kramer778,
возможно вы хотели это ... <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .hide { display: none; border: 1px solid red; } .hide.show { display: block; } </style> <script> document.addEventListener('DOMContentLoaded', function() { let select = document.querySelectorAll('.main_field'), hide = document.querySelectorAll('.hide'), len = select[0].options.length; let index = localStorage.show == undefined ? select[0].selectedIndex : localStorage.show; function change() { index = localStorage.show = this.selectedIndex; show(index); } function show(index) { hide.forEach((e, i) => {e.classList.toggle('show', i % len == index)}); select.forEach(s => s.options[index].selected = true) } select.forEach(s => s.addEventListener('change', change)); show(index); }); </script> </head> <body> <div class="hide one">Для первого селекта</div> <div class="hide two">Для второго селекта</div> <div class="hide three">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div> <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Первая опция </option> <option value="two"> Вторая опция </option> <option value="three" selected="selected"> Третья опция </option> </select> <hr> <div class="hide one">Для первого селекта</div> <div class="hide two">Для второго селекта</div> <div class="hide three">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div> <select id="main" name="main" class="main_field" aria-required="true"> <option value="one"> Первая опция </option> <option value="two"> Вторая опция </option> <option value="three" selected="selected"> Третья опция </option> </select> <div class="hide one">Для первого селекта</div> <div class="hide two">Для второго селекта</div> <div class="hide three">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div> </body> </html> |
То что надо! Спасибо Вам большое, Вы сделали мой день :thanks:
|
Помогите пожалуйста
Цитата:
window.addEventListener('DOMContentLoaded', function() { var select = document.querySelector('#main'), hide = document.querySelectorAll('.hide'); function change() { [].forEach.call(hide, function(el) { var add = el.classList.contains(select.value) ? "add" : "remove" el.classList[add]('show'); }); } select.addEventListener('change', change); change() }); </script> но он не работает, когда на одной странице три выпадающих списка выбора select. Как его исправить, чтобы работало с тремя select? |
Цитата:
При "тиражировании" селектов важную роль играет сама html-разметка. А ты примера ее не привел. :no: |
Вот пример на сайте
Извиняюсь за не полноту информации. Применяю скрипт здесь https://mactime.pro/sravnenie-iphone...action=preview
|
Bovem,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Часовой пояс GMT +3, время: 23:23. |