Изменить параметры выбора на основе выбора из нескольких итераций

У меня был выбор, который, в зависимости от выбранного параметра, влиял на параметры из двух других вариантов выбора (которые также влияли друг на друга между собой). До сих пор это работало нормально. Вот код, который у меня был:

HTML

<div id = "sel" class = "sel-val">
    <div class = "row">
        <div class = "col">
            <select class = "tipo" name = "tipo">
                <option selected>Select an option</option>
                <option value = "1">1</option>
                <option value = "2">2</option>
                <option value = "3">3</option>
                <option value = "4">4</option>
            </select>
        </div>
        <div class = "col">
            <select class = "num-a" name = "num-a">
                <option value = "0" selected>0</option>
            </select>
        </div>
        <div class = "col">
            <select class = "custom-select num-n" name = "num-n">
                <option value = "0" selected>0</option>
            </select>
        </div>
    </div>
</div>

JS

$('.tipo').on("change", function() {
    var val = $(this).val();
    $(".num-a").html(options1[val]);
    $(".num-n").html(options2[val]);
    if (val == 1) {
        $('.num-a').on("change", function() {
            var vara = $(this).val();
            $(".num-n").html(optionsIn[vara]);
        });
        $('.num-n').on("change", function() {
            var varn = $(this).val();
            $(".num-a").html(optionsIn[varn]);
        });
    }
    if (val == 2) {
        // same with different arrays
    }
    if (val == 3) {
        // same with different arrays
    }
    if (val == 4) {
        // same with different arrays
    }
});
var options1 = [
    array with options 1
];
var options2 = [
    array with options 2
];
etc ...

Мне пришлось изменить его, чтобы вместо одного раза у меня был один и тот же код, повторяемый X раз (в зависимости от ввода, установленного пользователем), каждый из которых будет иметь те же три выбора внутри, которые будут иметь те же варианты. Итак, теперь это выглядит примерно так:

<div id = "sel-1" class = "sel-val">
    <div class = "row">
        <div class = "col">
            <select class = "tipo" name = "tipo-1">
                options...
            </select>
        </div>
        <div class = "col">
            <select class = "num-a" name = "num-a-1">
                <option value = "0" selected>0</option>
            </select>
        </div>
        <div class = "col">
            <select class = "custom-select num-n" name = "num-n-1">
                <option value = "0" selected>0</option>
            </select>
        </div>
    </div>
</div>
...
<div id = "sel-X" class = "sel-val">
    <div class = "row">
        <div class = "col">
            <select class = "tipo" name = "tipo-X">
                options...
            </select>
        </div>
        <div class = "col">
            <select class = "num-a" name = "num-a-X">
                <option value = "0" selected>0</option>
            </select>
        </div>
        <div class = "col">
            <select class = "custom-select num-n" name = "num-n-X">
                <option value = "0" selected>0</option>
            </select>
        </div>
    </div>
</div>

Проблема в том, что с кодом, который у меня есть, всякий раз, когда я устанавливаю любую из опций .tipo, это влияет на все выборки X .num-a и .num-n (также изменение любого из .num-a влияет на все .num-n и наоборот), когда это должно влиять только на параметры соответствующего n-го выбора.

Мне пришлось изменить первое on("change") на $(document).on('change') для распознавания выбора (нашел его в ответе другого пользователя), поэтому первая строка сценария теперь:

$(document).on('change','.tipo-habitacion-sel', function() {

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

Если код представляет собой HTML, CSS и JS, создайте работающий фрагмент.

react_or_angluar 10.12.2020 01:06

Используемый console.info?

react_or_angluar 10.12.2020 02:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку в вашем html-коде есть несколько вариантов выбора, чтобы ссылаться только на необходимые варианты, которые вы можете использовать .closest(), это получит ближайший div, например: sel-val, а затем используйте метод .find, чтобы найти поле выбора, где вам нужно добавить новые параметры

Демонстрационный код:

$(document).on('change', '.tipo', function() {

  var val = $(this).val();
  //get closest div with class sel-val
  var selector = $(this).closest(".sel-val")
  //then use find to get required select refernce
  selector.find(".num-a").html("<option>0</option><option value='1' >1</option>");
  selector.find(".num-n").html(" <option>0</option><option value='1' >1</option>");


  //other codes.

});

$(document).on('change', '.num-a', function() {

  var vara = $(this).val();
  var selector = $(this).closest(".sel-val")
  // $(".num-n").html(optionsIn[vara]);
  selector.find(".num-n").html("<option>0</option><option value='2'>2</option>");
});

$(document).on('change', '.num-n', function() {

  var varn = $(this).val();
  var selector = $(this).closest(".sel-val")
  //$(".num-a").html(optionsIn[varn]);
  selector.find(".num-a").html("<option>0</option><option value='3'>3</option>");

});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id = "sel-1" class = "sel-val">
  <div class = "row">
    <div class = "col">
      <select class = "tipo" name = "tipo-1">
        <option value = "0">0</option>
        <option value = "4">4</option>
      </select>
    </div>
    <div class = "col">
      <select class = "num-a" name = "num-a-1">
        <option value = "0" selected>0</option>
      </select>
    </div>
    <div class = "col">
      <select class = "custom-select num-n" name = "num-n-1">
        <option value = "0" selected>0</option>
      </select>
    </div>
  </div>
</div>
<hr>
<div id = "sel-X" class = "sel-val">

  <div class = "row">
    <div class = "col">
      <select class = "tipo" name = "tipo-X">
        <option value = "0">0</option>
        <option value = "4">4</option>
      </select>
    </div>
    <div class = "col">
      <select class = "num-a" name = "num-a-X">
        <option value = "0" selected>0</option>
      </select>
    </div>
    <div class = "col">
      <select class = "custom-select num-n" name = "num-n-X">
        <option value = "0" selected>0</option>
      </select>
    </div>
  </div>
</div>

Другие вопросы по теме