SmthTo
@SmthTo
Все перепёлки мира будут оплакивать мою смерть.

Как произвести динамическое копирование/удаления текста выбранных option из multiple select в div в случае, если их несколько?

Здравствуйте!

К сожалению, я очень хреновый знаток JS, возникла необходимость динамического копирования текста выбранных option из select'ов в div. Я написал косой код... и все бы работало хорошо, но проблема моего подхода заключается в том, что я создаю один и тот же массив для всех select'ов, из-за чего контент во всех фильтрах копируется одинаковый.

Я понимаю, что я хреновый разработчик. Я понимаю, что нативный multiple select на ПК не очень удобен, но эти фильтры предназначаются для мобильных, поэтому select'ы на телефонах я буду скрывать визуально и абсолютно позиционировать, чтобы они были доступны по клику на блок. Появляется нативное окно выбора опций, что на телефонах вполне удобно.

Для понимания происходящего в примере я визуально показываю эти select'ы.
Покликайте в примере по опциям нескольких фильтров— вы сразу поймете проблему (в блок справа от названия копируются все выбранные опции по всем фильтрам):


P. S. В реальном проекте все остальные алгоритмы (очищение выбранного фильтра, сброс и AJAX-подгрузка кол-ва товаров уже работают, кроме вот этой визуальной штуки.
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const filterSelector = '.s-mobile-filter-type-select';
const selectSelector = '.s-mobile-filter-type-select__select';
const selectedSelector = '.s-mobile-filter-type-select__selected-options-list-content';

Вот jquery:

$(selectSelector).on('change', function() {
  $(this)
    .closest(filterSelector)
    .find(selectedSelector)
    .text($('option:selected', this).get().map(n => $(n).text()).join(', '));
});

А вот jquery катится к чёрту:

const updateSelected = select => select
  .closest(filterSelector)
  .querySelector(selectedSelector)
  .textContent = Array
    .from(select.selectedOptions, n => n.text)
    .join(', ');


// можно назначить обработчик события каждому select'у индивидуально
document.querySelectorAll(selectSelector).forEach(function(n) {
  n.addEventListener('change', this);
}, e => updateSelected(e.target));

// или, применяем делегирование
document.addEventListener('change', ({ target: t }) => {
  if (t.matches(selectSelector)) {
    updateSelected(t);
  }
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы