Обновить блок div, через jQuery

Рейтинг: 0Ответов: 1Опубликовано: 04.08.2023

Несколько вопросов: в блоке есть два select

 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p><div class="position-relative row form-group">
<label for="exampleSelect" class="col-sm-2 col-form-label">Вид обращения</label>
<div class="col-sm-10">
<select class="selectpicker form-control" name="type" "required>
    <!-- {{"/concept/order-type.1c"}} -->                                       
</select>
                                                                                                                    
</div>
<br>
<br></br>
<label for="exampleSelect" class="col-sm-2 col-form-label">Категория обращения</label>
<div class="col-sm-10">
<select id="selectcat" class="selectpicker form-control" data-live-search="true" name="typeС" required>                                     
    <!-- {{"/concept/order-type2.1c"}} -->  
</select>
</div>      
</div></p>

Есть функция myFunction, которой я пытаюсь обновить список select, пытался через

    var block = document.getElementById('main');
    block.innerHTML = block.innerHTML;

Пытался через

$("#main").load(location.href + " #main");

Не выходит(. Что касается select и соответственно <option, строятся они с файла /concept/order-type.1c Мысль такая, есть ли возможность заменить блок, для перестроения из файла select (Категория обращения) , с возможностью подцепить новое значение select (Вид обращения)? Или просто повторить код нижнего select (Категория обращения), при выборе верхнего select (Вид обращения). С javascript работал очень мало, прошу прощения заранее, если что то неверно написал. Заранее спасибо)

Вся страница

<head>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
</head>
<!-- ============================================================== -->
<!-- wrapper -->
<!-- ============================================================== -->
    <div class="dashboard-ecommerce">
        <div class="dashboard-content">
            <!-- ============================================================== -->
            <!-- pageheader  -->
            <!-- ============================================================== -->
            <div class="row">
                <div class="col-xl-12 col-lg-12 col-md-12 col-sm-12 col-12">
                    <div class="page-header">
                        <h2 class="pageheader-title">Новое обращение</h2>
                        <div class="page-breadcrumb">
                            <nav aria-label="breadcrumb">
                                <ol class="breadcrumb">
                                    <li class="breadcrumb-item"><a href="<!-- {{П.Запрос.БазовыйURL}} -->/concept/index.html" class="breadcrumb-link">Главная</a></li>
                                    <li class="breadcrumb-item active" aria-current="page">Новое обращение</li>
                                </ol>
                            </nav>
                        </div>
                    </div>
                </div>
            </div>
            <!-- ============================================================== -->
            <!-- end pageheader  -->
            <!-- ============================================================== -->
            <div  class="ecommerce-widget">
                <div  class="row">
                    <div class="col-xl-12 col-lg-12 col-md-12 col-sm-12 col-12">
                        <div class="card">
                            <div  class="card-body">
                                <form action="<!-- {{П.Запрос.БазовыйURL}} -->/concept/order-add.1c" id="MyForm" method="POST" class="needs-validation">
                                    <div id="display"></div>
                                    
                                    <p><div id="main" class="position-relative row form-group">
                                    <label for="exampleSelect" class="col-sm-2 col-form-label">Вид обращения</label>
                                        <div class="col-sm-10">
                                            <select class="selectpicker form-control" name="type" "required>
                                                <!-- {{"/concept/order-type.1c"}} -->                                       
                                            </select>
                                                                                                                    
                                        </div>
                                    <br>
                                    <br></br>
                                    <label for="exampleSelect" class="col-sm-2 col-form-label">Категория обращения</label>
                                        <div class="col-sm-10">
                                            <select id="selectcat" class="selectpicker form-control" data-live-search="true" name="typeС" required>                                     
                                            <!-- {{"/concept/order-type2.1c"}} -->  
                                            </select>
                                    </div>
    
                                    </div></p> 
                                    
                                   <div class="position-relative row form-group"><label for="exampleText" class="col-sm-2 col-form-label">Ваше имя</label>
                                        <div class="col-sm-10"><textarea name="namespec" class="form-controlName" rows="1" required></textarea></div>
                                    </div>
                                    
                                    <div class="position-relative row form-group"><label for="exampleText" class="col-sm-2 col-form-label">Текст обращения</label>
                                        <div class="col-sm-10"><textarea name="description" class="form-control" rows="3" required></textarea></div>
                                    </div>
                                    <div class="position-relative row form-group"><label for="exampleText" class="col-sm-2 col-form-label"></label>
                                        <div class="col-sm-10">
                                            <input type="submit" class="btn btn-primary" value="Отправить">
                                        </div>
                                    </div>
                                                                  
                                      
                                 <script>
function myFunction() {
$("#main").load();
 }
</script>
</form>
    </div>
   </div>
     </div>
       </div>
        </div>
    </div>
<!-- ============================================================== -->
<!-- end wrapper  -->
<!-- ============================================================== -->

СтрокаДанных = П.Запрос.ПолучитьТелоКакСтроку();

Рез = Новый Структура;
Рез.Вставить("type","");
 

Рез = лк_ОбщегоНазначения.ЗаполнитьЗначенияПараметров(СтрокаДанных, Рез);


КатегорияОбращения = Справочники.лк_ТипыОбращений.НайтиПоНаименованию(Рез.type);


ТекстЗапроса = "ВЫБРАТЬ
    |   лк_КатегорииОбращения.Ссылка КАК Ссылка,
    |   лк_КатегорииОбращения.Наименование КАК Наименование
    |ИЗ
    |   Справочник.лк_КатегорииОбращения КАК лк_КатегорииОбращения
    |ГДЕ
    |   НЕ лк_КатегорииОбращения.ПометкаУдаления
    |   И лк_КатегорииОбращения.ТипОбращения = &ТипОбращения
    |
    |УПОРЯДОЧИТЬ ПО
    |   Наименование";
 
 
 
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ТипОбращения",КатегорияОбращения);
Выборка = Запрос.Выполнить().Выбрать();

html = "value=''></option>"; // Добавим первое значение - пустую строку

Пока Выборка.Следующий() Цикл
   
html = html + Символы.ПС;
html = html + "<option data-tokens='" + Выборка.Наименование + "' value='" + Выборка.Ссылка.УникальныйИдентификатор() + "'>" + Выборка.Наименование + "</option>";

КонецЦикла;

Ответы

▲ 0

Js работает с уже полностью загруженной страницей. С точки зрения js в странице нет никаких <!-- {{"/concept/order-type2.1c"}} -->. Js видит конкретные теги option и может оперировать ими. Это означает, что если логика формирования options находится у вас не на стороне фронта, то вам придётся делать http-запросы на бэк, чтобы получить новые option.

Схема такая:

  • когда происходит change значения первого <select>
  • сделать запрос на бэк
  • из полученного ответа извлечь нужные <option> и заменить ими содержимое второго <select>

Запрос на бэк должен включать выбранный type из первого <select> (если я правильно понял 1c код), чтобы в ответе оказались нужные <option>. Удобно было бы сделать запрос прям к /concept/order-type2.1c. Но если это невозможно, то можно запросить текущую страницу и отыскать на ней опции второго <select>.

$('.selectpicker').on('change', function() {
    $('.selectcat').load(location.href + ' .selectcat option'); // тут к url'у ещё надо будет добавить ваш выбранный тип
    return false;
});

Такая схема будет работать, но она достаточно корявая в плане архитектуры. Лучшим решением было бы заведение API, который отдавал typeC опции в формате json, например. Тогда запрос TypeC опций получал бы чистые данные без html-разметки и формировал бы теги на стороне фронта.


Использование jQuery сегодня считается дурным тоном. Ванильный js теперь достаточно лаконичный и выразительный, чтобы обойтись без сторонних библиотек для решения таких простых задач. Если вы планируете поддерживать этот проект, подумайте об отказе от jQuery в тех случаях, где его легко заменить стандартным js.