заполнить поле выбора при предыдущем выборе и с помощью клона

Я пытаюсь добавить функцию клонирования для полей выбора. У меня есть 3 поля выбора: страна, штат, город и первый пользователь выбирают страну, а поле выбора состояния на основе идентификатора заполняется параметрами, и то же самое с раскрывающимся списком городов будет заполняться только при выборе штата.

Затем у меня есть дополнительная опция, где я все регенерирую. поэтому я клонирую свой div, но проблема, когда я меняю свою страну вместо отображения раскрывающегося списка нового состояния, возвращает его к предыдущему раскрывающемуся списку:

  $('.country').on('change',function(){
        var id = $(this).val();
        callAjax(id);
    });
    $('.state').on('change',function(){
        var id = $(this).val();
        callAjax(id);
    });

  $('#btClone').on('click', function () {

        $('#country')
            .clone()
            .attr('id', 'country_' + i)
            .attr('name', 'country_' + i)
            .appendTo("#container2");
        $('#state')
            .clone()
            .attr('id', 'state_' + i)
            .attr('name', 'state_' + i)
            .appendTo("#container2");
      i =i+1;
    });

Мой HTML выглядит так

 <div id="container1">
                <select id="country" name="country" class="hidden country">
                </select>
                <select id="state" name="state" class="hidden state">
                </select>
                <select id="city" name="city" class="hidden city">
                </select>
             <span id="selected-profile"></span>
             <div id="addons" class="hidden">

                <input type="button" id="btClone" value="Clone the list" style="float:right;" />
             </div>
         </div>
        <div id="container2" style="display:none;"></div>

Я хочу, когда я нажимаю «Добавить новый», затем выбираю страну, затем что-то меняю, мой ajax-вызов снова вызывает, но на данный момент я не могу этого сделать, потому что у меня уже есть варианты


person Daniel_12    schedule 27.06.2018    source источник
comment
Откуда я в вашем обработчике кликов? Должна быть ошибка.   -  person C4pt4inC4nn4bis    schedule 27.06.2018
comment
его глобальная переменная   -  person Daniel_12    schedule 27.06.2018


Ответы (1)


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

function initRow($row){
  $row.find('select[name="country"]').on('change', function () {
      var thisRow = $(this).closest('div.row');
      var stateDD = thisRow.find($('select[name="state"]'));
      stateDD.show();

      stateDD.on('change',function(){
        var cityDD = thisRow.find('select[name="city"]');
        cityDD.show();
        cityDD.on('change',function(){

        });
      });
  });
}
$('#container1 .row').each(function(){
	initRow($(this));
});
$('#btClone').click(function(){
	var rowTemplate = $('#container1 > .row').eq(0).clone();
  rowTemplate.find('select[name="state"]').hide();
  rowTemplate.find('select[name="city"]').hide();
	initRow(rowTemplate.appendTo($('#container1')));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container1">
  <div class="row">
    <select name="country" class="hidden country">
      <option value=1>country 1</option> <option value=2>country 2</option>
    </select>
    <select name="state" class="hidden state" style="display:none;">
      <option value=1>state 1</option> <option value=2>state 2</option>
    </select>
    <select name="city" class="hidden city" style="display:none;">
       <option value=1>city 1</option> <option value=2>city 2</option>
    </select>
  </div>
</div>
<input type="button" id="btClone" value="Clone the list" style="float:right;" />

person C4pt4inC4nn4bis    schedule 27.06.2018
comment
Да, это клонирование, но не так, как я хочу. Я хочу, чтобы, когда я нажимаю «Добавить новый», отображалось раскрывающееся меню «Страна», а когда я меняю страну, затем раскрывающееся меню «Штат» отображалось с параметрами и то же самое с раскрывающимся списком «Штат». - person Daniel_12; 27.06.2018
comment
Хорошо, вы не закодировали это. Для этого второе раскрывающееся меню должно быть вставлено ПРИ ИЗМЕНЕНИИ первого. Я обновил код примера. - person C4pt4inC4nn4bis; 27.06.2018
comment
Я хочу использовать тот же метод ajaxcall, и я не уверен, как реализовать эту функцию. - person Daniel_12; 27.06.2018
comment
Создайте логику, чтобы сначала добавить новые раскрывающиеся списки. Затем добавьте свою ajax-функцию в события изменения. Шаг за шагом - person C4pt4inC4nn4bis; 27.06.2018
comment
Эта функция клонирования добавляет раскрывающийся список. Если я прав? извините, я очень новичок в программировании, поэтому не знаю много об этом - person Daniel_12; 27.06.2018
comment
clone() удваивает html-элемент. append() добавляет его к указанному элементу html. изменение - это другое событие, чем щелчок. Посмотрите мой обновленный пример выше - person C4pt4inC4nn4bis; 27.06.2018
comment
Когда я нажимаю кнопку «Добавить еще», затем нажимаю на страну, чтобы изменить ее, добавляя раскрывающийся список нового состояния и с параметрами раскрывающегося списка предыдущего состояния. - person Daniel_12; 27.06.2018
comment
если я меняю 5 раз страну, то это добавляет 5 новых выпадающих штатов - person Daniel_12; 27.06.2018
comment
да потому что так запрограммировано. Вы должны изучить основы jquery-событий, чтобы придумать конкретный вопрос. Все, что вам нужно для выполнения ваших потребностей, находится в приведенном выше примере. - person C4pt4inC4nn4bis; 27.06.2018
comment
Без проблем! Хотел бы помочь, когда у вас возникнут дополнительные вопросы. А пока - не могли бы вы поддержать мой ответ? - person C4pt4inC4nn4bis; 27.06.2018
comment
Приятель, не могли бы вы помочь мне, как я могу добавить только одно раскрывающееся меню, если оно уже есть. я застрял - person Daniel_12; 27.06.2018
comment
с $(this).off(change); умеет это делать :) - person Daniel_12; 27.06.2018
comment
ОК, я еще раз обновил пример - надеюсь, он соответствует вашим потребностям. - person C4pt4inC4nn4bis; 27.06.2018
comment
но нам нужно сделать селектор динамическим, чтобы правильно указать значение параметра? по состоянию на nw все (id, имя) одинаково для каждого выпадающего списка - person Daniel_12; 27.06.2018
comment
Просто добавьте вызов функции для каждого раскрывающегося списка, который будет возвращать значения для этого конкретного выбора, передавая тип, например. city ​​и функция возвращает массив городов. - person C4pt4inC4nn4bis; 27.06.2018
comment
Да, я сделал то же самое, вызвав ajaxcall(id,state), но в методе успеха ajax добавил данные, такие как $(data.success).each(function(index, element) { $('#'+selectId).append('‹ option value=' + element.entity_id + '›' + element.name + '‹/option›'); }); Но этот идентификатор не уникален, поэтому, когда я меняю страну в клонированном поле, отбрасывание состояния получает уже предыдущий вариант. - person Daniel_12; 27.06.2018