Tkreks
@Tkreks
Системный инженер

Можно ли по получить div id вышестоящего блока в рамках одной collumn и вставить его в значение?

Приветствую.
Делаю для супруги управлялку для управления яндекс станциями. Фронт делаю на bootstrap.
Изначально я оформил тупо в виде кнопок, но со временем решил красиво оформить и сделать уже красивую управлялку для умного дома, т.к. супруга не особо хочет залезать в умный дом алисы или HA, то решил вынести это в отдельную управлялку. Одна из страниц этой управлялки сейчас работает для управления некоторыми из станций.
Собственно чтобы не сильно заморачиваться и не писать огромную портянку кода слушателя под каждую кнопку, я решил все кнопки запихнуть в и повесил слушателя на js, который ловит нажатия на кнопки форм
Код слушателя
//При нажатии submit (кнопки) выполняем функцию
$('form').submit(function (e) {
e.preventDefault();
var formID = $(this).attr('id');
var data = $('#' + formID).serializeArray();
$.ajax({
type: "POST",
url: 'action',
data: data,
success: function(response){
$('#successresult').html(response);
},
});});

Собственно всё чудесно работает. Далее на скриншоте, на примере одной колонки я выделил красным все , т.е. каждый красный элемент представляет из себя в которой есть и есть еще несколько
Картинка
66d6fa8e7be7c556082036.png

Код на примере кнопки паузы
<div class="col-4 col-xl-4">
<form id="aliceplaystop">
<button class="btn" type="submit">
<svg >....</svg>
</button>
<input class="form-control" type="hidden" id="text-1" name="text" value="Пауза">
<input class="form-control" type="hidden" id="Action-1" name="Action" value="Command">
<input class="form-control" type="hidden" id="Room-1" name="Room" value="Детская">
</form>
</div>

Собственно дальше уже срабатывает JS слушатель форм, по ajax он отправляет данный на бэк, далее я уже маршрутизирую эти запросы на основе полученных hidden полей и выполняю нужные мне действия, но вопрос немного в ином. Иногда, я могу полностью переделать внешний вид блока с колонкой, поменять местами элементы, добавить новые кнопки и тд. Сейчас подключено 4 колонки, фактически на этой странице их будет 6. Когда я вношу изменения, я делаю так -
1. вношу изменения в первую колонку, которая в детской
2. потом копирую целиком весь блок колонки, и вставляю его на нужные места. Меняю название комнаты, меняю картинку, меняю название колонки, меняю названия переменных и так по каждой колонке.
Когда было всего 2, это было не долго и не сильно накладно. Сейчас же 11 форм на одну колонку, и то я планирую увеличить до 15 на колонку, и я еще не все колонки на эту страницу подключил.
Вот тут у меня родился вопрос, можно ли сделать например так, чтобы задать для Column или Div колонки какой нибудь ID или допустим class, и использовать его и вносить его значение в нужные мне места, как это можно сделать?
В общем, хочу себе как то упростить работу, чтобы в случае с переделками не сильно заморачиваться и затрачивать много усилий для корректировки каждой колонки. Расскажите как Вы работаете над такими однотипными блоками, буду рад даже логической цепочке. просто за 3 дня я уже полностью 2 раза переделал внешний вид отображения, и где то после каждой переделки, еще по часу сижу, меняю названия переменных.
А дальше еще вебсокеты подключать, чтобы динамически данные обновлять...

Картинк
66d70fccb335c132513682.png
  • Вопрос задан
  • 133 просмотра
Решения вопроса 3
402d
@402d
начинал с бейсика на УКНЦ в 1988
Батенька, вы уже дозрели до перехода от статичного html к его динамической генерации.
Можно по классике возложить эту задачу на бакенд, а можно динамически собирать html из javascript.

Но в обоих подходах потребуется понять, что вам не нужно кучу разных однотипных переменных.
Да и сам подход стоит поменять.
например кнопки оключить/подключить интернет.
<button class="...  mySwithInet .... "  data-status="on/off"  data-device="alisa-1">Отключить интернет</button>

по псевдоКлассу mySeitchInet навешивается слушатель нажатия. Аргументы(data-) можно получить так
https://developer.mozilla.org/ru/docs/Learn/HTML/H...

можно использовать parentElement, чтобы id устройства не писать кучу раз
https://www.w3schools.com/jsref/prop_node_parentel...

когда вы повесили слушателя, то внутри функции this будет указывать на нажатый элемент. И все остальное ищете через него.
Ответ написан
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
Берем современный фреймворк. Например Vue, как самый легкий для старта.
Делаем компонент для карточки станции yandex-station.vue, описываем там весь шаблон, всю логику.
Потом используем столь раз, сколько нужно.
<yandex-station title="Макс" room="Детская">
<yandex-station title="Станция 2" room="Коридор">
...


Захотели поменять внешний вид или функциональность для карточки станции - меняем только компонент yandex-station.vue, остальное даже трогать не придется.

А вот это вот вся лапша в итоге приведет к полному бардаку в кодовой базе.
Ответ написан
Tkreks
@Tkreks Автор вопроса
Системный инженер
Собственно немного углубился в тему. Воспользовался идеей от Сергей delphinpro и подсмотрел кусочки кода от Олег .
Т.к. я использую bootstrap, там всё на row,col,div и тд. Я немного изменив свой шаблон, начал генерировать динамически код для каждой колонки. Т.к. у меня есть API для этой страницы, и предварительно мне всё равно в этом API нужно настраиваться свои колонки, то у меня получилась примерно следующая логика загрузки страницы:
Загружается страница -> запускается JS -> обращение к API -> получение массива колонок с текущими параметрами -> далее срабатывает динамическая генерация. Код имеет такой вид
<script>
        const apiUrl = 'http://127.0.0.1:1818/alice';
        const actionUrl = 'http://127.0.0.1:1818/action';
        
        // Функция для обновления данных агента
        function updateAlice() {
            $.get(apiUrl, function(data) {
                if (data && data.length > 0) {
                    $('#alice_columns').empty(); // Очищаем старые данные
                    data.forEach(alice=> {
                        // Создаем новую колонку для колонки
                        
const aliceColumn = `...куча html кода...'

Кнопки избавил от form, привел к обычному виду, избавился от form.
<button id="stop_${alice.room}" class="btn" data-bs-toggle="tooltip" type="button" title="Остановить воспроизведение">

При помощи this, при нажатии на кнопку получаю данные именно нужной кнопки в нужной колонке. . Пришлось немного заморочиться с back, т.к. пришлось развернуть sql и там хранить данные. по всем колонкам, которые отдаются при загрузке страницы, но в целом когда настроил, добавил свою логику для добавления новых устройств, работать стало в разы проще и удобнее. По сути код вместо
800+ строк стал около 120, и в случае изменения шаблона col колонки, мне достаточно внести изменения в одном месте. Так что свою задачу я решил, всем спасибо за участие и правильные советы, которые позволили мне прийти к нужному понимаю.
P.S. WS к этому делу прикрутил, пришлось немного заморочиться с проверкой, какие данные нужно обновлять, использую 2 таблицы, a - actual, b - history. сравниваю их между собой, отличия отправляю по ws, в b записываю все данные из a. Данные с колонок поступают в хаотичном порядке, с интервалом от 0.5 - 2 секунд. Эти данные записываются в "a", далее срабатывает скрипт сравнения, если есть отличия между a и b, они отправляются в браузер пользователя. Т.е. таким образом, в браузер отправляются только измененные данные, те данные, которые браузер уже получил - не будут отправлены, тем самым минимизирую сетевую нагрузку и отправляю только то, что нужно обновить.
msg.b = RED.util.cloneMessage(global.get("b"));
msg.a = RED.util.cloneMessage(global.get("a"));

msg.c = {};

for (let key in msg.a) {
    if (msg.b.hasOwnProperty(key)) {
        // Проверяем, если ключ существует в обоих объектах и значения различаются
        if (msg.a[key] !== msg.b[key]) {
            msg.c[key] = msg.a[key];  // Добавляем в msg.c ключи с различиями
            msg.b[key] = msg.a[key];  // Обновляем значения в msg.b
        }
    } else {
        // Если ключ есть только в msg.a, то добавляем его в msg.c и msg.b
        msg.c[key] = msg.a[key];
        msg.b[key] = msg.a[key];
    }
}

// Сохраняем обновленный объект msg.b в глобальную переменную
global.set("b", msg.b);

// Устанавливаем msg.c в payload для возврата различий
msg.payload = msg.c;

return msg;

P.P.S. Не знаю как, не знаю почему, у меня эта ПУ опубликована на моем домене в https://site.ru/home/site/alice, но каким то образом кто-то нашел мой сайт и начал делать различные действия с колонками, пришлось добавить проверку cookies. Если в кукисах нет пароля, то ничего не срабатывает и выводится окно для ввода пароля. Т.е. в режиме read only посмотреть сайт можно, а вот что-то сделать - будь добр введи пароль) Если хацкер от сюда, то знай что пароль 1234)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы