Выбор select ajax опаздывает на один шаг

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

В продолжении вопроса - при выбора опции select, цвета в input type="color" меняются сразу, а в таблице со второго раза. Где исправить чтобы и стиль таблицы отрисовывался сразу?

const def = [
  {v: '#idColor_th', t: '.th'},
  {v: '#idColor_td1', t: '.td1'},
  {v: '#idColor_td2', t: '.td2'},
]
$(document).on('input', function oninputColor() {
  def.forEach(o => {
    const e = $(o.t)
    e.css('backgroundColor', $(o.v).val())
    e.css('color', $(o.v + '_text').val())
  })
})

/* При изменении select */
$('#theme_ids').on('change', function(){

    theme_id = $('#theme_ids').val();
    $.ajax({
        url: 'ajax.php', 
        method: 'post',
        data: { 'theme_ids': theme_id },
        success: function(data){
            $('#idColor_th').val(data['color_th']);
            $('#idColor_th_text').val(data['color_th_text']);
            $('#idColor_td1').val(data['color_td1']);
            $('#idColor_td1_text').val(data['color_td1_text']);
            $('#idColor_td2').val(data['color_td2']);
            $('#idColor_td2_text').val(data['color_td2_text']);
        }
    });
});
.tlist{
    table-layout: fixed;
}
.tlist th{
    background: #efefef;
    border: 1px solid #cfcfcf;
}
.tlist td{
    border: 1px solid #eee;
}
.tlist tbody tr:nth-child(odd){
    background: #fff;
}
.tlist tbody tr:nth-child(even){
    background: #f7f7f7;
}
<form action="" method="post">
 <select name='theme_ids' id='theme_ids'>
  <option value=1>Gray</option>
  <option value=2>Green</option>
  <option value=3>Orange</option>
 </select>
 <input type="submit" value="Применить" name="apply_theme_btn">
</form>
 
 <form action="" method="post">
    <table>
        <tr>
            <td>Шапка</td>
            <td class="w250">
                <input type="color" id="idColor_th" name="color_th" value="#efefef"></td>
            <td rowspan="8" style="vertical-align:top;">

                <table id="pattern" class="tlist">
                    <tr class="th">
                        <th class="th">Столбец 1</th>
                        <th class="th">Столбец 2</th>
                        <th class="th">Столбец 3</th>
                    </tr>
                    <tr class="td1">
                        <td>Цифры</td>
                        <td>123 456,78</td>
                        <td>90 987 123,00</td>
                    </tr>
                    <tr class="td2">
                        <td>Дата</td>
                        <td>05.01.2023</td>
                        <td>14.07.2023</td>
                    </tr>
                    <tr class="td1">
                        <td>Контакты</td>
                        <td>example@pochta.uz</td>
                        <td>+998 00 123 45 78</td>
                    </tr>
                    <tr class="td2">
                        <td>Данные</td>
                        <td>Маткарим Маримбоевич</td>
                        <td>ООО "NAME"</td>
                    </tr>
                </table>

            </td>
        </tr>
        <tr>
            <td>Текст шапки</td>
            <td><input type="color" id="idColor_th_text" name="color_th_text" value="#000000"></td>
        </tr>
        <tr>
            <td>Нечётные строки</td>
            <td><input type="color" id="idColor_td1" name="color_td1" value="#f7f7f7"></td>
        </tr>
        <tr>
            <td>Текст нечётных строк</td>
            <td><input type="color" id="idColor_td1_text" name="color_td1_text" value="#000000"></td>
        </tr>
        <tr>
            <td>Чётные строки</td>
            <td><input type="color" id="idColor_td2" name="color_td2" value="#ffffff"></td>
        </tr>
        <tr>
            <td>Текст чётных строк</td>
            <td><input type="color" id="idColor_td2_text" name="color_td2_text" value="#000000"></td>
        </tr>
        <tr>
            <td>Название стиля</td>
            <td><input type="text" name="theme_name"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Сохранить" name="save_theme_btn"></td>
            <td></td>
        </tr>
    </table>
</form>

Содержимое ajax.php
if(!empty($_POST['theme_ids'])){
/* тут выбирается данные из БД и возвращается в массиве $theme */

ob_end_clean();
header('Content-Type: application/json');
echo json_encode($theme); //, JSON_UNESCAPED_UNICODE
exit();        
}

UPD: Решил вопрос таким образом. Сделал 2 отдельных ajax запроса при выборе опции из select'а. Соответственно 2 обработчика в файле ajax.php. Один запрос возвращает данные по цветам на input colors, второй запрос возвращает готовую таблицу-шаблон с цветовой схемой, то есть отрисовывает таблицу заново.

Ответы

▲ 0

при выбора опции select, цвета в input type="color" меняются сразу, а в таблице со второго раза. Где исправить чтобы и стиль таблицы отрисовывался сразу?

У тебя есть функция oninputColor - ее можно вызвать после обработки полученных данных.

//
success: function(data){
     $('#idColor_th').val(data['color_th']);
     $('#idColor_th_text').val(data['color_th_text']);
     $('#idColor_td1').val(data['color_td1']);
     $('#idColor_td1_text').val(data['color_td1_text']);
     $('#idColor_td2').val(data['color_td2']);
     $('#idColor_td2_text').val(data['color_td2_text']);
     // вот в этом месте
     oninputColor()
}
//

Можно еще вызвать "навешенное" событие. Т.е. вместо вызова функции можно эмитировать событие.

$(document).on('input', _ => {
  console.log('Событие наступило')
})
$('button').on('click', _ => {
  // имитация события input на элементе document
  const event = new Event('input')
  document.dispatchEvent(event)
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input />
<button>Тест</button>