Ограничение параметров после выбора пользователем (HTML) - PullRequest
0 голосов
/ 12 марта 2020

На данный момент у меня есть два списка вариантов для выбора формы в HTML. Однако выбор значения в одном списке сделает невозможным определенные параметры во втором списке. В частности, первый список представляет собой список возможных единиц измерения (см, дюймы, футы), а второй - список местоположений. Выбор единицы будет ограничивать количество возможных мест, которые будут иметь эту единицу. Точно так же выбор значения страны ограничил бы количество доступных единиц. Можно ли каким-либо образом ограничить выбор, доступный пользователю после того, как он выберет местоположение или единицу?

Unit:
<br>
<select name="unit_input">
    <br>
    <option selected disabled hidden></option>
    <option value="l">League</option>
    <option value="m">Mile</option>
    <option value="ft">Foot</option>
    <option value='m'>Meter</option>
    <option value="st">Stage</option>
    <option value="km">Kilometer</option>
</select>
<br>

Location:
<br>
<select name="nationality_input">
    <br>
    <option selected disabled hidden></option>
    <option value="italian">Italian</option>
    <option value="german">German</option>
    <option value="french">French</option>
    <option value="hungarian">Hungarian</option>
    <option value="british">British</option>
    <option value="swiss">Swiss</option>
    <option value="spanish">Spanish</option>
</select>
<br>
<br>

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Теоретически вы должны быть в состоянии сделать это с чистым CSS с чем-то вроде:

#second option { display: none; }
#first:has(> option#a:checked) ~ #second option.a { display: block; }
#first:has(> option#b:checked) ~ #second option.b { display: block; }
#first:has(> option#c:checked) ~ #second option.c { display: block; }
<select id="first">
  <option id="a">a</option>
  <option id="b">b</option>
  <option id="c">c</option>
</select>
<select id="second">
  <option class="a b c">Shown for all options</option>
  <option class="a">Shown when a selected</option>
  <option class="c">Shown when c selected</option>
</select>

Однако пока ничего не поддерживает :has(). С изменением реализации вы можете сделать нечто подобное в чистом CSS. Хотя гораздо лучше go маршрут JavaScript; как следующее имеет ряд предостережений:

label:after { content: ''; display: block; }
input[name=second] { display: none; }
input[name=second] + label { display: none; }
#a:checked ~ input[name=second].a { display: inline; }
#a:checked ~ input[name=second].a + label { display: inline; }
#b:checked ~ input[name=second].b { display: inline; }
#b:checked ~ input[name=second].b + label { display: inline; }
#c:checked ~ input[name=second].c { display: inline; }
#c:checked ~ input[name=second].c + label { display: inline; }
<h4>First</h4>
<input id="a" type="radio" name="first" /><label>A</label>
<input id="b" type="radio" name="first" /><label>B</label>
<input id="c" type="radio" name="first" /><label>C</label>
  
<h4>Second</h4>
<input id="d" type="radio" name="second" class="a b c" /><label>Shown for all options</label>
<input id="e" type="radio" name="second" class="a" /><label>Shown when a is selected</label>
<input id="f" type="radio" name="second" class="c" /><label>Shown when c is selected</label>

Основная проблема с вышесказанным заключается в том, что для того, чтобы полагаться на селектор ~, все входы должны быть родственный. Так что это сильно влияет на ваш макет, и то, что вы действительно можете достичь. Как только :has() будет поддерживаться, станут доступны чистые CSS опции, но даже тогда вы, как правило, хотите больше логической обработки, чем может предложить CSS, то есть, как вы разрешаете пользователю выходить и возвращаться к той же точке в форме? Или что происходит со значением выбранного параметра, когда он исчезает? Именно здесь JavaScript определенно победит.

Формы являются прекрасным примером того, как создание пользовательского интерфейса (пользовательского интерфейса) на основе дерева состояний является хорошей идеей. Это, как правило, в центре внимания фреймворков, таких как React или Vue. Где, в зависимости от текущего «состояния» (дерева объектов, которое описывает выбранные параметры), пользовательский интерфейс просто «реагирует» и скрывает / показывает условные элементы. Прочитать об этом с чисто «государственной» точки зрения, может быть хорошей идеей рассмотреть Redux или аналогичные технологии в качестве основы того, что вы создаете.

0 голосов
/ 12 марта 2020

Да, используя JavaScript: https://codepen.io/dpamonty/pen/PoqRZQd

(не забудьте добавить ID в раскрывающийся список, чтобы код работал).

<!doctype html>
<html>
    <head>
    </head>
    <body>
        Unit:
        <br>
        <select id="unit_input" name="unit_input" onchange="restrictDropDownLists()">
            <br>
            <option selected disabled hidden></option>
            <option value="l">League</option>
            <option value="m">Mile</option>
            <option value="ft">Foot</option>
            <option value='m'>Meter</option>
            <option value="st">Stage</option>
            <option value="km">Kilometer</option>
        </select>
        <br>
        <br>
        <br>

        Location:
        <br>
        <select id="nationality_input" name="nationality_input" onchange="restrictDropDownLists()">
            <br>
            <option selected disabled hidden></option>
            <option value="italian">Italian</option>
            <option value="german">German</option>
            <option value="french">French</option>
            <option value="hungarian">Hungarian</option>
            <option value="british">British</option>
            <option value="swiss">Swiss</option>
            <option value="spanish">Spanish</option>
        </select>
        <br>
        <br>
        <script type="text/javascript">
            function restrictDropDownLists(){
                var unit = document.getElementById("unit_input");
                var nationalilty = document.getElementById("nationality_input");

                switch(unit.value){
                    case "m":
                        // Options to hide:
                        nationalilty.options[1].style.display = "none"; // Italian
                        // etc.
                        // Options to show:
                        nationalilty.options[4].style.display = ""; // British
                        // etc.
                        break;
                    // etc.
                }

                switch(nationalilty.value){
                    case "british":
                        // Options to hide:
                        unit.options[6].style.display = "none"; // Kilometer
                        // etc.
                        // Options to show:
                        unit.options[1].style.display = ""; // League
                        // etc.
                    // etc.
                }
            }

            // Restrict on the page load as well:
            restrictDropDownLists();
        </script>
    </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...