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
  • Вопрос задан
  • 137 просмотров
Решения вопроса 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)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы