Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Отображение элемента в зависимости от выбора select (https://javascript.ru/forum/events/70659-otobrazhenie-ehlementa-v-zavisimosti-ot-vybora-select.html)

Alexodiy 22.09.2017 21:48

Отображение элемента в зависимости от выбора 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 опция. Как сделать так, чтобы скрипт отрабатывал вывод блока во время загрузки или после загрузки страницы?

рони 22.09.2017 21:54

Alexodiy,
а можно классы вместо style?

Alexodiy 22.09.2017 22:01

Можно классы, если проще будет, главное что в зависимости от выбранной опции, а опция может быть выбрана другая и их может быть больше, там с пхп связано, но отображать или нет тут на помощь js приходит

рони 22.09.2017 22:07

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>

Alexodiy 24.09.2017 19:32

Спасибо огромное.

Alexodiy 24.09.2017 19:43

А вы можете еще подсказать? Если например мы имеем аналогичную ситуацию, только вместо блоков мы имеем 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

рони 24.09.2017 20:28

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>

Alexodiy 24.09.2017 21:32

Ясность полная, но в форме много <input type="checkbox" />, как сделать для определенной группы, ато в форме все инпуты выделятся начинают

рони 24.09.2017 21:37

Alexodiy,
придумать класс для инутов
hide = document.querySelectorAll('.Ваш_класс');
или обернуть их одним элементом с классом
и тогда hide = document.querySelectorAll('.Ваш_класс input');

Kramer778 16.02.2023 10:20

Цитата:

Сообщение от рони (Сообщение 465186)
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>

Доброго времени суток. Подскажите пожалуйста. А можно сделать, чтобы выбор сохранялся при обновление страницы? Например, если выбрать "Вторая опция", этот выбор был сохранен на всех страницах сайта, до тех пор пока не изменить его, ну или не очистить куки.

рони 16.02.2023 11:03

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 16.02.2023 12:40

Спасибо огромное!

Цитата:

Сообщение от рони (Сообщение 550694)
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>


рони 16.02.2023 12:50

Kramer778,
копировать сообщения целиком не обязательно, это засоряет тему, и есть цитирование.

Kramer778 16.02.2023 14:20

Хорошо, буду знать :)
Еще вопрос, а можно ли эти селекты дополнительно вывести в произвольном месте шаблона и чтобы они были взаимосвязаны и отображали содержимое выбора? Например выводим селекты в подвале:

<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>


Возможно ли сделать, чтобы при выборе например "Вторая опция", выводилось "Для второго селекта" в изначальном месте и соответственно селект в изначальном месте тоже менялся на "Вторая опция"?

рони 16.02.2023 17:27

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>

Kramer778 16.02.2023 18:20

Гениально! Вы просто Мастер!

Только у меня возникла следующая проблема. Хотел от обратного продублировать и вывести получаемый контент в произвольном месте.

<div class="hide one">Для первого селекта</div>
    <div class="hide two">Для второго селекта</div>
    <div class="hide three">Для третьего селекта, опция выбрана изначально. Надо что бы этот блок отображался сразу.</div>


Но из-за того, что в стилях стоит
.hide { display: none;}
дивы не отображаются. Случайно не знаете как можно решить данную задачу?

рони 16.02.2023 18:44

Kramer778,
не понимаю.

рони 16.02.2023 18:55

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>

Kramer778 16.02.2023 19:09

То что надо! Спасибо Вам большое, Вы сделали мой день :thanks:

Bovem 30.08.2023 11:02

Помогите пожалуйста
 
Цитата:

Сообщение от рони (Сообщение 465186)
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>

Мне пригодился ваш код <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> но он не работает, когда на одной странице три выпадающих списка выбора select. Как его исправить, чтобы работало с тремя select?

ksa 30.08.2023 12:18

Цитата:

Сообщение от Bovem
Как его исправить, чтобы работало с тремя select?

Одной правки скрипта мало...
При "тиражировании" селектов важную роль играет сама html-разметка. А ты примера ее не привел. :no:

Bovem 30.08.2023 20:10

Вот пример на сайте
 
Извиняюсь за не полноту информации. Применяю скрипт здесь https://mactime.pro/sravnenie-iphone...action=preview

рони 30.08.2023 22:29

Bovem,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.


Часовой пояс GMT +3, время: 23:23.