Как исправить проблему с условным выпадающим списком - PullRequest
0 голосов
/ 11 апреля 2019

Я создал условный выпадающий список, в котором по умолчанию используются значения «Выбор марки автомобиля» и «Выбор модели автомобиля». Выбор модели автомобиля по умолчанию отключен, поскольку я хочу, чтобы клиент сначала выбрал марку, чтобы мы могли загрузить соответствующие модели.

Есть еще одна опция, которая называется "другое". Это означает, что если марка и модель не указаны в списке, выберите другое. Другое принесет два поля ввода текста, где клиент может написать марку и модель самостоятельно.

Проблема 1: Теперь перейдем к вопросу: если я выберу любое «Сделать», по умолчанию поле «Модель» должно просто стать активным, и это работает нормально, но что не так с ним, так это то, что выпадающий список моделей выбирает »- другое - «по умолчанию вместо« Выбрать модель автомобиля ».

Проблема 2. Как заменить раскрывающийся список моделей на текстовое поле ввода при выборе «- другое -» в раскрывающемся списке «Модель».

В ожидании решения.

var $make = $('#make'),
  $model = $('#model'),
  $options = $model.find('option');

$('#make').on('change', function() {
  if (this.value == '*') {
    removeClassDynamicClass();
    changeModelDiv();
    $("#others").addClass("hide");
    $("#others input").attr("disabled", "disabled");
    $(".model-div-not-others").removeClass("hide");
    $(".model-div-not-others select").removeAttr("disabled");
    $(".model-div-for-others").addClass("hide");
    $('#model').attr('disabled', 'disabled');
    $("#country-registeration").attr('disabled', 'disabled');
    $("#opt-details").attr('disabled', 'disabled');
  } else if (this.value == 'others') {

    if ($('.dynamic-class-4').hasClass('col-lg-4')) {
      $('.dynamic-class-4').removeClass('col-lg-4');
      $('.dynamic-class-4').addClass('col-lg-3');
    }
    changeModelDiv();
    $("#others").removeClass("hide");
    $("#others input").removeAttr("disabled");
    $(".model-div-not-others").addClass("hide");
    $(".model-div-for-others").removeClass("hide");
    $(".model-div-for-others input").removeAttr("disabled");
    $('#model').attr('disabled', 'disabled');
    $("#opt-details").removeAttr('disabled');
    // In-case of other countries added remove the below commented code
    //$("#country-registeration").removeAttr('disabled');

  } else {
    $model.html($options.filter('[value="' + this.value + '"]'));
    removeClassDynamicClass();
    changeModelDiv();
    $("#others").addClass("hide");
    $("#others input").attr("disabled", "disabled");
    $(".model-div-not-others").removeClass("hide");
    $(".model-div-not-others select").removeAttr("disabled");
    $(".model-div-for-others").addClass("hide");
    $('#model').removeAttr('disabled');
    $("#opt-details").removeAttr('disabled');
    // In-case of other countries added remove the below commented code
    //$("#country-registeration").removeAttr('disabled');
  }
});

function removeClassDynamicClass() {
  if ($('.dynamic-class-4').hasClass('col-lg-3')) {
    $('.dynamic-class-4').removeClass('col-lg-3');
    $('.dynamic-class-4').addClass('col-lg-4');
  }
}

function changeModelDiv() {
  if ($('#make').val() == 'others') {
    $('.model-div-not-others').addClass("hide");
    $('.model-div-for-others').removeClass("hide");
    $('#model-others').removeAttr("disabled");
    $('#model').attr('disabled', 'disabled');
  } else {
    if ($('.model-div-not-others').hasClass("hide")) {
      $('.model-div-not-others').removeClass("hide");
      $('.model-div-for-others').addClass("hide");
      $('#model').removeAttr("disabled");
      $('#model-others').attr('disabled', 'disabled');
    }
  }
}

$('#make').trigger('change');
.hide {
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

<div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 dynamic-class-4 float-left mb-3">
  <label class="car-list-step-label">Make</label>
  <select class="form-control custom-select" name="make" id="make">
    <option disabled="disabled" selected="selected" value="*">Select vehicle make</option>
    <option value="1">Acura</option>
    <option value="2">Abarth</option>
    <option value="3">Alfa Romeo</option>
    <option value="4">Alpina</option>
    <option value="5">Aston Martin</option>
    <option value="others">Other</option>
  </select>
</div>
<!-- Make Others Details -->
<div id="others" class="col-xs-12 col-sm-6 col-md-4 col-lg-4 dynamic-class-4 float-left mb-3 hide">
  <label class="car-list-step-label">Make (others)</label>
  <input id="details" name="details" type="text" placeholder="Make" class="form-control car-list-input">
</div>

<!-- Vehicle Model -->
<div class="col-xs-12 col-sm-6 col-md-4 col-lg-4 dynamic-class-4 float-left mb-3">
  <div class="model-div-not-others">
    <label class="car-list-step-label">Model</label>
    <select class="form-control custom-select" name="model" id="model">
      <option disabled="disabled" selected="selected">Select vehicle model</option>
      <!-- Acura -->
      <option value="1">1.6 EL</option>
      <option value="1">1.7 EL</option>
      <option value="1">2.3 CL</option>
      <option value="1">2.5 TL</option>
      <option value="1">3.0 CL</option>
      <option value="1">3.2 TL</option>
      <option value="1">3.5 RL</option>
      <option value="1">CL</option>
      <option value="1">CSX</option>
      <option value="1">EL</option>
      <option value="1">ILX</option>
      <option value="1">Integra</option>
      <option value="1">Legend</option>
      <option value="1">MDX</option>
      <option value="1">NSX</option>
      <option value="1">NSX-T</option>
      <option value="1">RDX</option>
      <option value="1">RL</option>
      <option value="1">RSX</option>
      <option value="1">SLX</option>
      <option value="1">TL</option>
      <option value="1">TSX</option>
      <option value="1">Vigor</option>
      <option value="1">ZDX</option>
      <option value="1">- Other -</option>
      <!-- Abarth -->
      <option value="2">124</option>
      <option value="2">500</option>
      <option value="2">500C</option>
      <option value="2">595</option>
      <option value="2">595C</option>
      <option value="2">695</option>
      <option value="2">Grande Punto</option>
      <option value="2">Punto Evo</option>
      <option value="2">Spider Cabrio</option>
      <option value="2">- Other -</option>
      <!-- Alfa Romeo -->
      <option value="3">145</option>
      <option value="3">146</option>
      <option value="3">147</option>
      <option value="3">155</option>
      <option value="3">156</option>
      <option value="3">159</option>
      <option value="3">164</option>
      <option value="3">166</option>
      <option value="3">33</option>
      <option value="3">4C</option>
      <option value="3">75</option>
      <option value="3">Alfetta</option>
      <option value="3">GT</option>
      <option value="3">GTV</option>
      <option value="3">GTV-6</option>
      <option value="3">GTV6</option>
      <option value="3">Giulia</option>
      <option value="3">Guiletta</option>
      <option value="3">Milano</option>
      <option value="3">Mito</option>
      <option value="3">Spider</option>
      <option value="3">- Other -</option>
      <!-- Alpina -->
      <option value="4">B4</option>
      <option value="4">B5</option>
      <option value="4">- Other -</option>
      <!-- Aston Martin -->
      <option value="5">Cygnet</option>
      <option value="5">DB7</option>
      <option value="5">DB9</option>
      <option value="5">Rapide S</option>
      <option value="5">Vanquish S</option>
      <option value="5">Vantage</option>
      <option value="5">- Other -</option>
    </select>
  </div>
  <!-- Vehicle Model Others -->
  <div class="model-div-for-others hide">
    <label class="car-list-step-label">Model (others)</label>
    <input disabled id="model-others" name="models" type="text" placeholder="Model" class="form-control car-list-input">
  </div>
</div>

1 Ответ

1 голос
/ 11 апреля 2019

Чтобы устранить проблему # 1, одним из вариантов является предварительное присвоение значения параметру «-Select Vehicle Model» перед запуском фильтра, а затем установка его в качестве параметра «selected».

// pre-assign a value to the first option - "Select Vehicle Model" 
$("#model option:eq(0)").val(this.value);

// run the filter, which will now include the first option
$model.html($options.filter('[value="' + this.value + '"]'));

// make the first option the selected option
$("#model option:eq(0)").prop("selected",true);

Мое решение для CodePen: https://codepen.io/onegrumpybunny/full/NmjzXb

Для выпуска № 2 вы можете скрыть div, содержащий «модель», выбрать и показать div, содержащий «другое» текстовое поле.

$('#model').on('change', function() {
   if ($('#model :selected').text() == '- Other -') {

     // uncomment this to hide the "model" select when "other" option is selected
     //$('.model-div-not-others').addClass("hide"); 

     $('.model-div-for-others').removeClass("hide");
     $('#model-others').removeAttr("disabled");
   } else {
     $('.model-div-for-others').addClass("hide");
     $('#model-others').attr("disabled","disabled");
   }
});

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

--- edit --- Вот пример вашего приложения с допустимыми значениями, присвоенными каждому параметру, и фильтрацией, выполненной для значения атрибута данных: https://codepen.io/onegrumpybunny/full/wZevjy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...