Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.03.2021, 17:05
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

JS multiselect с кнопками удаления выбранных option

Подскажите, как реализовать что б по option:checked добавлялась нужная кнопка в верхнем блоке, а по её нажатию она бы убиралась из select, ну и выбранный options становился unchecked ? Пока удалось только показывать одну кнопку, а необходим массовый вывод
<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
      body {
        margin: 0;
      }

      .form_label {
        position: relative;
        min-height: 88px;
      }

      .form_text {
        vertical-align: top;
        display: block;
        margin-bottom: 6px;
        font-weight: 500;
        font-size: 12px;
        line-height: 16px;
        letter-spacing: .04em;
        color: #686EA1
      }

      .form_text>sup {
        position: relative;
        top: 0;
        font-size: 13px;
      }

      .field_multiselect {
        position: relative;
        width: 100%;
        display: block;
        border: 1px solid #CDD6F3;
        box-sizing: border-box;
        border-radius: 8px;
        padding: 12px 40px 10px 16px;
        outline-color: #CDD6F3;
      }

      .field_multiselect::placeholder {
        color: #A8ACC9;
      }

      .field_multiselect {
        padding-right: 60px;
      }

      .field_multiselect:after {
        content: "";
        position: absolute;
        right: 14px;
        top: 15px;
        width: 6px;
        height: 16px;
        background: url("../images/svg-icons/two-arrows.svg") 50% 50% no-repeat;
      }

      .multiselect_block {
        position: relative;
        width: 100%;
      }

      .field_select {
        position: absolute;
        top: calc(100% - 2px);
        left: 0;
        width: 100%;
        border: 2px solid #CDD6F3;
        border-bottom-right-radius: 2px;
        border-bottom-left-radius: 2px;
        box-sizing: border-box;
        outline-color: #CDD6F3;
      }

      .field_select[multiple] {
        overflow-y: auto;
      }

      .field_select option {
        display: block;
        padding: 8px 16px;
        width: calc(370px - 32px);
      }

      .field_select option:checked {
        background-color: #ECEFF3;
      }

      .field_multiselect button {
        position: relative;
        padding: 7px 34px 7px 8px;
        background: #EBE4FB;
        border-radius: 4px;
      }

      .field_multiselect button:after {
        content: '';
        position: absolute;
        top: 10px;
        right: 10px;
        width: 16px;
        height: 16px;
        background: url("../images/svg-icons/icon-close.svg") 50% 50% no-repeat;
        background-size: contain;
      }

      .multiselect_label {
        position: absolute;
        top: 1px;
        left: 2px;
        width: 100%;
        height: 44px;
        z-index: 3;
      }

      .field_select {
        display: none;
      }

      input.multiselect_checkbox {
        position: absolute;
        right: 0;
        top: 0;
        width: 40px;
        height: 40px;
        border: none;
        opacity: 0;
      }

      .multiselect_checkbox:checked ~ .field_select {
        display: block;
      }

      .multiselect_checkbox:checked ~ .multiselect_label {
        width: 40px;
        left: initial;
        right: 4px;
        background: #fff url("../images/svg-icons/icon-close.svg") 50% 50% no-repeat;
      }

    </style>
  </head>

  <body>
    <div class="form_label">
      <span class="form_text">Products<sup>*</sup></span>
      <div class="multiselect_block">
        <label for="select-1" class="field_multiselect">Products</label>
        <input id="checkbox-1" class="multiselect_checkbox" type="checkbox">
        <label for="checkbox-1" class="multiselect_label"></label>

        <select id="select-1" class="field_select" name="products" multiple style="height: calc(4 * 38px)">
          <option value="Applications">Applications</option>
          <option value="Parental controls">Parental controls</option>
          <option value="VPN">VPN</option>
          <option value="All">All</option>
        </select>
      </div>
    </div>

    <script>
      let fieldMultiselect = document.querySelectorAll(".field_multiselect"),
        multiselect = document.querySelectorAll(".field_select");


      multiselect.forEach((select) => {

        select.addEventListener("change", function(element) {
          let valueName = this.value;
          let multiselectField = this.parentElement.children[0];
          multiselectField.innerHTML = '<button class="btn_multiselect" type="button">' + valueName + '</button>';

          console.log("valueName", valueName);
        })
      });

    </script>
  </body>

</html>
Ответить с цитированием
  #2 (permalink)  
Старый 29.03.2021, 17:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Black_Star,
Ответить с цитированием
  #3 (permalink)  
Старый 29.03.2021, 17:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

<!DOCTYPE html>
<html lang="en">
 
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
      body {
        margin: 0;
      }
 
      .form_label {
        position: relative;
        min-height: 88px;
      }
 
      .form_text {
        vertical-align: top;
        display: block;
        margin-bottom: 6px;
        font-weight: 500;
        font-size: 12px;
        line-height: 16px;
        letter-spacing: .04em;
        color: #686EA1
      }
 
      .form_text>sup {
        position: relative;
        top: 0;
        font-size: 13px;
      }
 
      .field_multiselect {
        position: relative;
        width: 100%;
        display: block;
        border: 1px solid #CDD6F3;
        box-sizing: border-box;
        border-radius: 8px;
        padding: 12px 40px 10px 16px;
        outline-color: #CDD6F3;
      }
 
      .field_multiselect::placeholder {
        color: #A8ACC9;
      }
 
      .field_multiselect {
        padding-right: 60px;
      }
 
      .field_multiselect:after {
        content: "";
        position: absolute;
        right: 14px;
        top: 15px;
        width: 6px;
        height: 16px;
        background: url("../images/svg-icons/two-arrows.svg") 50% 50% no-repeat;
      }
 
      .multiselect_block {
        position: relative;
        width: 100%;
      }
 
      .field_select {
        position: absolute;
        top: calc(100% - 2px);
        left: 0;
        width: 100%;
        border: 2px solid #CDD6F3;
        border-bottom-right-radius: 2px;
        border-bottom-left-radius: 2px;
        box-sizing: border-box;
        outline-color: #CDD6F3;
      }
 
      .field_select[multiple] {
        overflow-y: auto;
      }
 
      .field_select option {
        display: block;
        padding: 8px 16px;
        width: calc(370px - 32px);
      }
 
      .field_select option:checked {
        background-color: #ECEFF3;
      }
 
      .field_multiselect button {
        position: relative;
        padding: 7px 34px 7px 8px;
        background: #EBE4FB;
        border-radius: 4px;
      }
 
      .field_multiselect button:after {
        content: '';
        position: absolute;
        top: 10px;
        right: 10px;
        width: 16px;
        height: 16px;
        background: url("../images/svg-icons/icon-close.svg") 50% 50% no-repeat;
        background-size: contain;
      }
 
      .multiselect_label {
        position: absolute;
        top: 1px;
        left: 2px;
        width: 100%;
        height: 44px;
        z-index: 3;
      }
 
      .field_select {
        display: none;
      }
 
      input.multiselect_checkbox {
        position: absolute;
        right: 0;
        top: 0;
        width: 40px;
        height: 40px;
        border: none;
        opacity: 0;
      }
 
      .multiselect_checkbox:checked ~ .field_select {
        display: block;
      }
 
      .multiselect_checkbox:checked ~ .multiselect_label {
        width: 40px;
        left: initial;
        right: 4px;
        background: #fff url("../images/svg-icons/icon-close.svg") 50% 50% no-repeat;
      }
 
    </style>
  </head>
 
  <body>
    <div class="form_label">
      <span class="form_text">Products<sup>*</sup></span>
      <div class="multiselect_block">
        <label for="select-1" class="field_multiselect">Products</label>
        <input id="checkbox-1" class="multiselect_checkbox" type="checkbox">
        <label for="checkbox-1" class="multiselect_label"></label>
 
        <select id="select-1" class="field_select" name="products" multiple style="height: calc(4 * 38px)">
          <option value="Applications">Applications</option>
          <option value="Parental controls">Parental controls</option>
          <option value="VPN">VPN</option>
          <option value="All">All</option>
        </select>
      </div>
    </div>
 
    <script>
        const multiselect = document.querySelector(".field_select");
        multiselect.addEventListener("change", function(element) {
			var s = '';
			for (let i=0; i< multiselect.selectedOptions.length; i++) {
				s+='<button class="btn_multiselect" type="button">' + multiselect.selectedOptions[i].value + '</button>'
			}
          let multiselectField = this.parentElement.children[0];
          multiselectField.innerHTML = s;
 
         console.log("valueName", s);
        })
 
    </script>
  </body>
 
</html>
Ответить с цитированием
  #4 (permalink)  
Старый 29.03.2021, 18:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Black_Star,
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            margin: 0;
        }

        .form_label {
            position: relative;
            min-height: 88px;
        }

        .form_text {
            vertical-align: top;
            display: block;
            margin-bottom: 6px;
            font-weight: 500;
            font-size: 12px;
            line-height: 16px;
            letter-spacing: .04em;
            color: #686EA1
        }

        .form_text>sup {
            position: relative;
            top: 0;
            font-size: 13px;
        }

        .field_multiselect {
            position: relative;
            width: 100%;
            display: block;
            border: 1px solid #CDD6F3;
            box-sizing: border-box;
            border-radius: 8px;
            padding: 12px 40px 10px 16px;
            outline-color: #CDD6F3;
        }

        .field_multiselect::placeholder {
            color: #A8ACC9;
        }

        .field_multiselect {
            padding-right: 60px;
        }

        .field_multiselect:after {
            content: "";
            position: absolute;
            right: 14px;
            top: 15px;
            width: 6px;
            height: 16px;
            background: url("../images/svg-icons/two-arrows.svg") 50% 50% no-repeat;
        }

        .multiselect_block {
            position: relative;
            width: 100%;
        }

        .field_select {
            position: absolute;
            top: calc(100% - 2px);
            left: 0;
            width: 100%;
            border: 2px solid #CDD6F3;
            border-bottom-right-radius: 2px;
            border-bottom-left-radius: 2px;
            box-sizing: border-box;
            outline-color: #CDD6F3;
        }

        .field_select[multiple] {
            overflow-y: auto;
        }

        .field_select option {
            display: block;
            padding: 8px 16px;
            width: calc(370px - 32px);
        }

        .field_select option:checked {
            background-color: #ECEFF3;
        }

        .field_multiselect button {
            position: relative;
            padding: 7px 34px 7px 8px;
            background: #EBE4FB;
            border-radius: 4px;
        }

        .field_multiselect button:after {
            content: '';
            position: absolute;
            top: 10px;
            right: 10px;
            width: 16px;
            height: 16px;
            background: url("../images/svg-icons/icon-close.svg") 50% 50% no-repeat;
            background-size: contain;
        }

        .multiselect_label {
            position: absolute;
            top: 1px;
            left: 2px;
            width: 100%;
            height: 44px;
            z-index: 3;
        }

        .field_select {
            display: none;
        }

        input.multiselect_checkbox {
            position: absolute;
            right: 0;
            top: 0;
            width: 40px;
            height: 40px;
            border: none;
            opacity: 0;
        }

        .multiselect_checkbox:checked~.field_select {
            display: block;
        }

        .multiselect_checkbox:checked~.multiselect_label {
            width: 40px;
            left: initial;
            right: 4px;
            background: #fff url("../images/svg-icons/icon-close.svg") 50% 50% no-repeat;
        }
    </style>
</head>

<body>
    <div class="form_label">
        <span class="form_text">Products<sup>*</sup></span>
        <div class="multiselect_block">
            <label for="select-1" class="field_multiselect">Products</label>
            <input id="checkbox-1" class="multiselect_checkbox" type="checkbox">
            <label for="checkbox-1" class="multiselect_label"></label>
            <select id="select-1" class="field_select" name="products" multiple style="height: calc(4 * 38px)">
                <option value="Applications">Applications</option>
                <option value="Parental controls">Parental controls</option>
                <option value="VPN">VPN</option>
                <option value="All">All</option>
            </select>
        </div>
    </div>
    <script>
        let multiselect_block = document.querySelectorAll(".multiselect_block");
        multiselect_block.forEach(parent => {
            let label = parent.querySelector(".field_multiselect");
            let select = parent.querySelector(".field_select");
            let text = label.innerHTML;
            select.addEventListener("change", function(element) {
                let selectedOptions = this.selectedOptions;
                label.innerHTML = "";
                for (let option of selectedOptions) {
                    let button = document.createElement("button");
                    button.type = "button";
                    button.className = "btn_multiselect";
                    button.textContent = option.value;
                    button.onclick = _ => {
                        option.selected = false;
                        button.remove();
                        if (!select.selectedOptions.length) label.innerHTML = text
                    }
                    label.append(button)
                };
            })
        })
    </script>
</body>

</html>
Ответить с цитированием
  #5 (permalink)  
Старый 29.03.2021, 18:52
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Огромное спасибо Это то что надо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Chosen js. Поиск по value option Самвел jQuery 6 21.05.2020 19:09
Диалог между HTML и внешним JS в контексте расширения GoogleChrome ev1lart Events/DOM/Window 0 26.04.2017 19:25
Добавить option в select при помощи js flyte Javascript под браузер 15 23.01.2017 11:23
JS при выборе определнных option расчитывается разная формула Psy Diamond Общие вопросы Javascript 8 22.04.2014 16:48
Выделение пункта option value чеhtp js tomclancys Элементы интерфейса 0 04.03.2010 12:30