Почему onChange заполняет выпадающий список со 2-й попытки?

#javascript #jquery #laravel

#javascript #jquery #laravel

Вопрос:

Я написал код для зависимого выпадающего списка в Laravel. Все в порядке, но я не знаю, почему мой выпадающий список заполняется со 2-й попытки. Я использовал библиотеку для повторителя форм из темы Metronic. Вот ссылка на эту библиотеку DubDriend. Вот часть HTML.

 <div class="form-group  m-form__group row" id="pModel_repeater">
            <label  class="col-lg-2 col-form-label">
                Inventory:
            </label>
            <div data-repeater-list="pModel" class="col-lg-10">
                <div data-repeater-item class="form-group m-form__group row align-items-center">
                    <div class="col-md-3">
                            <div class="m-form__group m-form__group--inline">
                                <div class="m-form__label">
                                    <label>
                                        Product:
                                    </label>
                                </div>
                                <div class="m-form__control">
                                    <select onchange="showModel(this)" id="productss" name="product" class="form-control m-input m-input--air m-input--pill" id="exampleSelect1" required>
                                            <option value="">Select Product</option>
                                        @foreach($product as $key => $value)
									        <option value="{{ $value->id}}">{{ $value->name}}</option>
								        @endforeach	
									</select>
                                </div>
                            </div>
                            <div class="d-md-none m--margin-bottom-10"></div>
                        </div>
                        <div class="col-md-3">
                                <div class="m-form__group m-form__group--inline">
                                    <div class="m-form__label">
                                        <label>
                                            Model:
                                        </label>
                                    </div>
                                    <div class="m-form__control">
                                        <select name="productModel" onchange="showPart(this)" class="form-control m-input m-input--air m-input--pill" id="productModel" required>
                                                <option value="">Select Model</option>	
                                        </select>
                                    </div>
                                </div>
                                <div class="d-md-none m--margin-bottom-10"></div>
                            </div>
                            <div class="col-md-3">
                                <div class="m-form__group m-form__group--inline">
                                    <div class="m-form__label">
                                        <label>
                                            Parts:
                                        </label>
                                    </div>
                                    <div class="m-form__control">
                                        <select name="productPart" class="form-control m-input m-input--air m-input--pill" id="productPart" required>
                                                <option value="">Select Part</option>	
                                        </select>
                                    </div>
                                </div>
                                <div class="d-md-none m--margin-bottom-10"></div>
                            </div>
                        <div class="col-md-3">
                                <div class="m-form__group m-form__group--inline">
                                    <div class="m-form__label">
                                        <label>
                                            Quantity:
                                        </label>
                                    </div>
                                    <div class="m-form__control">
                                        <input name="qty" type="number" class="form-control m-input" placeholder="Enter Quantity" required>
                                    </div>
                                </div>
                                <div class="d-md-none m--margin-bottom-10"></div>
                            </div>
                    <div class="col-md-4">
                        <div data-repeater-delete="" class="btn-sm btn btn-danger m-btn m-btn--icon m-btn--pill">
                            <span>
                                <i class="la la-trash-o"></i>
                                <span>
                                    Delete
                                </span>
                            </span>
                        </div>
                    </div>
                </div>
            </div>
        </div>  

И это функция Javascript здесь.

 function showModel(abc)
{
    var productName =   $(abc).attr("name");
    var model1 = productName.substr(0, 9);
    console.log(productName   " | "   model1);
    jQuery('select[name="'   productName   '"]').on('change',function(){
                var productID = jQuery(this).val();
                    // console.log(countryID);
               if(productID)
               {
                  jQuery.ajax({
                     url : '/pparts/models/'  productID,
                     type : "GET",
                     dataType : "json",
                     success:function(data)
                     {
                        jQuery('select[name="'   model1   '[productModel]"]').empty();
                        $('select[name="'   model1   '[productModel]"]').append('<option value="">Select Model</option>');
                        jQuery.each(data, function(key,value){
                           $('select[name="'   model1   '[productModel]"]').append('<option value="'  key  '">'  value  '</option>');
                        });
                     }
                  });
               }
               else
               {
                  $('select[name="'   model1   '[productModel]"]').empty();
               }
             });
}  

Мне нужно заполнить выпадающий список с первой попытки.

Комментарии:

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

2. Как я могу получить значение выбранной опции выпадающего списка с именем, а не идентификатором?

3. abc это объект выбора, который был изменен, потому что вы передаете this его из встроенного прослушивателя событий. abc.value было бы это текущее значение, на которое оно было изменено. Или $(abc).val() , если вам просто нужно использовать jQuery, 🙂