По поводу обновления.
DAK85 opened this issue · 656 comments
Просто для размышления.
Сейчас, как я понимаю, если мы через ajax_update передаёи список компонентов, то на странице формируется ява код, который на каждый элемент из списка делает пост запрос, в ответ получает данные, при этом, чтобы получить данные, в обработчике надо принять запрос и сформировать на него ответ.
Когда я на php городил отображение информации из базы данных (при этом без перезагрузки картинки), то я пользовался некими плюшками от jquery. Если подключить эту библиотеку, то в принципе можно иначе организовать обновление
<html>
<head>
<script type="text/javascript" src="/jquery-3.6.0.min.js"></script>
<script language="JavaScript">
setInterval(function(){
$('#all').load('# #all');},1000);
</script>
</head>
<body>
<div id="all">
тут весь портал
</div>
</body></html>
В этом варианте (на сколько я понимаю), броузер будет обновлять всю страницу 1 раза в секунду, если будут изменения в блоке с id=all, то он просто подменит этот блок, более ничего не трогая. По факту это почти равносильно обновлению страницы, только незаметное для глаза.
При этом не надо будет трогать обработчик. По факту весь код будет генерировать функция конструктора.
Это всё в теории, на практике ещё не проверял, пока честно некогда, вот через пару недель возможно получится выделить время на сиё занятие.
Есть задумка сделать нечто типо GP.JQUERY_UPDATE(Список блоков для обновления, интервал). Эта функция должна правильно генерировать скрипт обновления, что то типа
<script type="text/javascript" src="/jquery-3.6.0.min.js"></script>
<script language="JavaScript">
setInterval(function(){
$('#id1').load('# #id1');
.......
$('#idN').load('# #idN');
},1000);
</script>
А в конструкторе нечто типf GP.DIV(ид блока),
потом элементы, которые надо обновлять (вообще хоть что)
после GP.DIVEND;
По идее это должно обновлять блоки с любым содержимым.
Так же jquery имеет мощные штуки для всего, я лишь капельку их применяю.
Просто представь что есть блок в конструкторе, который возникает при определённых обстоятельствах (допустим датчик температуры сообщил о перегрева мостов), в конструкторе предусмотрено создание окна сверху страницы с предупреждением.
и это окно просто появится на экране в случае перегрева...
Однако библа почти 100 Кбайт весом.
Интересно. По поводу окошка - в js есть alert
, который можно посадить на апдейт) могу заняться
Может пока не стоит, давай лучше вики пилить, это я к тому написал, чтобы назад вернуть AJAX_UPDATE вместо UPDATE, а в следующих версиях можно было бы новые фичи строить. По моей практике появляются подводные камни с отправкой данных форм с помощью кнопки субмит (просто если сервер на апаче и юзаются сессии, то сервер не доверяет данным посланные с помощью этой кнопки, так как типо данные из прошлого, в случае твоего портала такого не должно быть). Сейчас портал довольно классный, я бы даже сказал, он просто супер. Я уже закончил свой проект, теперь мне надо заказывать платы и прочую лабуду.
Скоро Алиса в моём доме начнёт управлять светом:) Возможно я попробую реализовать и данный механизм и оттестировать его на своём проекте (у меня масса всего на обновление, куча страниц, локальный запуск на отдельном ядре, загрузка сохранение, всякие переходы, определение IP клиента и ограничение доступа, всякие кодовые слова и прочее), если возникнут глюки, то я их точно поймаю. Так как у тебя идёт из версии в версию поддержка ранее написанного кода, то поддержку твоего метода обновления всё равно надо оставить, как минимум - это более экономичный подход, чем тот, который я описал выше.
Если вдруг решишь переделать, то я готов к тестированию почти в любой момент.
А пока я очень жду вики, мне надо отформатировать свои картинки, а я до сих пор не понимаю как это делать. Как сделать так, чтобы Label был слева, а switch и прочее справа. Как ты получаел те красивые картинки, которые были в прошлом issue. Однозначно надо делать доки! Портал просто БОМБИЧЕСКИЙ, я бы реально сломал себе пол года жизни, если бы не заюзал твой фреймворк.
alert я все таки сделаю, прикольно)
Апдейт я думаю оставить как есть, апдейт и аякс_апдейт. Если появится новый, то jquery и назовём. А стандартный покороче будет
Красивое форматирование - смотри элементы BOX - выравнивание по горизонтали. То есть в актуальной версии топология такая (если смотреть на картинку где по горизонтали несколько блоков на подложке):
- GRID - собирает элементы по горизонтали, задуман для BLOCK элкментов. Причем он responsive от ширины экрана, это супер килл фича я прям в шоке когда сделал и протестировал....
- BLOCK - объединяет компоненты по вертикали, на цветной подложке
- BOX - объединяет по горизонтали с возможностью настроить выравнивание
Итого тот красивый скриншот:
GRID
BLOCK
BOX
BOX
BOX
/BLOCK
BLOCK
BOX
BOX
BOX
/BLOCK
/GRID
Боксы можно вложить друг в друга, например внешний бокс разносит элементы по краям, первый элемент это лейбл, а второй - ещё один бокс с двумя чекбоксами например, выравнивание по правому краю. Можно очень гибко дизайн построить таким образом.
Сейчас пишу проект на базе портала, параллельно допиливаю портал. В моей версии появились макросы, которыми все эти боксы-блоки строятся одной командой, н каких begin end уже не надо) просто нереальная штука получилась, и парсинг компонентов ещё сделал одной строкой
Не сложно бросить прям сюда код контруктора для картинкок из прошлого ишью. Так мне будет более понятно. можно просто файл вывалить, мне кажется, что я смогу разобраться на наглядном примере.
Я в отъезде) с собой есть код вот такой
GP_MAKE_GRID(
GP_MAKE_BLOCK_TAB(
"MOTOR CONFIG",
GP_MAKE_BOX(GP.LABEL("Min duty"); GP.SLIDER("mdu", data.mdu, 0, 1024););
GP_MAKE_BOX(GP.LABEL("Velocity"); GP.SLIDER("vel", data.vel, 0, 30););
GP_MAKE_BOX(GP.LABEL("Accel."); GP.SLIDER("acc", data.acc, 0, 30););
GP_MAKE_BOX(GP.LABEL("Min vel"); GP.SLIDER("minv", data.minv, 0, 10, 0.5););
);
GP_MAKE_BLOCK_TAB(
"MANUAL",
GP_MAKE_BOX(GP.LABEL("Duty"); GP.SLIDER("spd", duty, 0, 1023););
GP_MAKE_BOX(GP.BUTTON("bkw", "◄"); GP.BUTTON("frw", "►"););
);
);
Это примерно верхние два блока на скриншоте. Но одинаковой ширины, на скриншоте ширина задана разная (тоже можно)
По поводу alert, тебе надо просто сделать скрипт который после получения 1 на запрос алерта полностью обновляет страницу. Думаю так будет классно!
Зачем, получаем answer и выводим текст из него в окошке
Ещё добавилось удержание кнопки, изменение слайдеров и спиннеров колёсиком мыши, и ещё что то
На форуме один участник спрашивал, как ему открыть страницу не по нажатию, а в заданное время. То есть можно было организовать ява запрос на обновление. если с actiona прилетит 1, то ява должна понять, что пора обновить страницу целиком. А уж как там отработает код конструктора - пофиг, как кто захочет, так тот и сделает. Главное, чтоб была такая возможность...
Ещё добавилось удержание кнопки, изменение слайдеров и спиннеров колёсиком мыши, и ещё что то
Я как понимаю это всё у тебя в кастоме добавилось, правильно я понимаю?:)
ява должна понять, что пора обновить страницу целиком
А она может так? Я вроде искал и не нашел, или путаю с чем то другим. Если можно - добавлю конечно
в кастоме добавилось
Нет конечно! Официальные фичи в релиз, документированные
Я тоже не представляю как обновлять страницу и точно ненавижу яву.
Смотрю в твой код и думаю, если в конструкторе добавить одну строчку
"if(item.type=='hidden'&&item.value=='reload'&&Number(resp)==1)location.reload();\n"
"else if(item.type=='checkbox'||item.type=='radio')item.checked=Number(resp);\n"
В конструкторе сделать
GP.UPDATE("WebPage");
GP.HIDDEN("WebPage","reload");
то вот если с обработчика послать в ответ на update 1 сможет ява таким образом обработать ответ или нет я не знаю..
Если сможет, то наверное обновит страницу...
То есть location reload это обновить страницу? Можно тогда просто невидимый блок со скриптом сделать, и он по своему же таймеру будет релод делать
Лучше без релоад, релоад только когда надо. А так, представь, ты вводишь текст в поле, а в этот момент релоад...
А в какой момент надо релод?
А, по кнопке, но зачем) чисто форма с кнопкой так делает
https://html-plus.in.ua/dialogovye-okna-prompt-i-confirm/
prompt и confirm тоже класcные)
На форуме один участник спрашивал, как ему открыть страницу не по нажатию, а в заданное время.
если про меня, то я не об этом.
в библиотеке реализована удобная навигация по BUTTON_LINK
в void build()
if (portal.uri() == "/page1")
Как запустить эту страницу не через сайт, а например через
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, subnet);
WiFi.softAP(ssidAP, passAP);
portal.attachBuild(page1);
такая строка, надо создавать отдельный void page1()
можно ли запустить из void build()
страницу page1
?
На форуме один участник спрашивал, как ему открыть страницу не по нажатию, а в заданное время.
если про меня, то я не об этом. в библиотеке реализована удобная навигация по
BUTTON_LINK
вvoid build()
if (portal.uri() == "/page1")
Как запустить эту страницу не через сайт, а например через
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, subnet);
WiFi.softAP(ssidAP, passAP);
portal.attachBuild(page1);
такая строка, надо создавать отдельныйvoid page1()
можно ли запустить из
void build()
страницуpage1
?
void build() {
if (portal.uri() == "/page1") page1();
}
Сомневаюсь, что компилятор поймёт, что такое page1(); ведь этой функции не должно быть)
Посмотрим, что в новой библиотеке на этот момент сделано.
portal.attachBuild(build(portal.uri(page1)));
Вот так изложу мысль)
portal.attachBuild(build(portal.uri(page1)));
мысль предельно не ясна и выражена с ошибками)
Что не так) как автоматически загрузить страницу из portal.uri не по клику)
portal.attachBuild(build(portal.uri(page1)));
мысль предельно не ясна и выражена с ошибками)
Согласен
загрузить страницу из portal.uri
portal.uri
это String строка. А также esp не может принудительно выгрузить страницу браузеру. Браузер - клиент, он обращается к есп, она выдаёт страницу
Что не так) как автоматически загрузить страницу из portal.uri не по клику)
void build() {
if (portal.uri() == "/page1") {
//конструктор страницы page1
BUILD_BEGIN();
GP.THEME(GP_DARK);
GP.BUTTON("but_id", "Button text")
BUILD_END();
}
}
Понятно, значит оставляю отдельным билдом, для этой страницы. Думал чуть уменьшить строчки кода. Ну всё равно, код сильно уменьшил, объединив под один build свои страницы.
Что не так) как автоматически загрузить страницу из portal.uri не по клику)
void build() { if (portal.uri() == "/page1") { //конструктор страницы page1 BUILD_BEGIN(); GP.THEME(GP_DARK); GP.BUTTON("but_id", "Button text") BUILD_END(); } }
Есть у меня эта страница и много других. Навигация по кнопкам и ссылкам работает.
Сначала загружается корневая. От неё уже идёт навигация по настройкам. Хотел настройки запускать при старте точки, при отсутствии ссид и пароля, открыть страницу с вводом их. Сейчас это отдельный билд, void page1.
Надо телеграм подключать для обсуждения, а не этот чат)
отсутствии ссид и пароля
вот по этому условию в функции build и выдавать форму логин-пароль
Я тут малость костыль небольшой сделал)
String ParseUri(String uri) {
const String hexDigits = String(F("0123456789ABCDEF"));
int from;
int i;
while (true) {
i = uri.indexOf('%', from);
if (i >= (int)uri.length() - 1 || i < 0) break;
String str = uri.substring(i, i+3);
from = i + 1;
String input = str;
uint8_t result;
input.toUpperCase();
for (int i = 0; i < input.length(); i++) {
result <<= 4;
result |= hexDigits.indexOf(input[i]);
}
String ch = String(char(result));
uri.replace(str,ch);
}
return uri;
}
Эта функция превращает /set%202
в /set 2
. %20 это браузер заменяет пробел в uri а у меня есть файлы с пробеламы) от теперь будут открываться. И да эта функция заменяет все коды с % на нужные символы. Сделайте в документации что файлы должны быть без пробелов (если еще не написано).
это браузер заменяет
потому что нельзя использовать пробел в строке адреса
я знаю
Что не так) как автоматически загрузить страницу из portal.uri не по клику)
Если бы (ASM) нормально сформулировал вопрос на форуме, уже бы давно его решил. Слежу за этой веткой очень внимательно.
Теперь по делу, файл /jquery-3.6.1.min.js качается с официального сайта и просто кладётся в корень
При этом как я понимаю надо не забыть сделать аутодовнлоад.
void JQUERY_UPDATE(const String& list, int prd = 1000) {
String s;
s.reserve(300);
s += F("<script src=\"/jquery-3.6.1.min.js\"></script>\n");
s += F("<script>setInterval(function(){\n");
GP_parser p;
while (p.parse(list)) {
s += F("$('#");
s += p.str;
s += F("').load('# #");
s += p.str;
s += F("');\n");
}
s += F("},");
s += prd;
s += F(");</script>\n");
SEND(s);
}
void DIV_BEGIN(const String& id) {
String s;
s.reserve(40);
s += F("<div id='");
s += id;
s += F("'>\n");
SEND(s);
}
void DIV_END() {
BLOCK_END();
}
В конструкторе подключаю только по условие (лишний раз не хочу файл подгружать, грузим только тогда, когда надо обновлять)
..............
if (portal.uri().startsWith("/settings/control/")) {
GP.JQUERY_UPDATE("LedSW");
}
..............
} else if (portal.uri().startsWith("/settings/control/")) {
int idroom=portal.uri().substring(portal.uri().lastIndexOf("/")+1).toInt();
GP.DIV_BEGIN("LedSW");
for (int h=0;h<RelayCount;h++){
if (RoomRelay[h]==idroom){
GP.LABEL(NameRelay[h]);
GP.LED_RED("LedRedRelay@"+String(h),!CoreGR.getStateRelay(h));
GP.SWITCH("SWidrelay@"+String(h), CoreGR.getStateRelay(h));
GP.LED_GREEN("LedGreenRelay@"+String(h),CoreGR.getStateRelay(h));
GP.HR();
}
}
GP.DIV_END();
GP.BUTTON_LINK("/", "Назад");
Всё что между DIV_BEGIN и DIV_END будет обновляться без всяких дополнительных обработок в action
А теперь анализ результатов
Сперва старый способ обновления
Как видно, иногда начинается следующий опрос раньше, чем приходят ответы от предыдущего. Зато трафик минимальный.
Теперь jquery
Данные приходят за 1 запрос, по факту идёт обновление страницы каждую минуту. Однако получается более красиво.
Трафик видно, значительно выше.
Оба способа имеют право на жизнь, ajax хорош там, где надо мало компонентов обновлять, jquery готов обновить страницу, на кторой тьма компонентов для обновления.
И да, jquery в принципе по барабану что обновлять и не надо в обработчике пилить кучу всего
Ну и последнее, нежелательно в блок обновления всовывать форму, вот в форму блок обновления можно сувать без проблем.
ТАК НЕЛЬЗЯ:
<div id=indexupd><form></form></div>
ТАК МОЖНО
<form><input><div id=indexupd><led></div><submit> </form>
С обновлением всей страницы по ответу от сервера - я не пробовал, мне кажется что это лишнее.
Хотя наверное выглядело бы прикольно, нажимаешь на кнопочки со стороны контроллера, а в телефоне открываются различные страницы...
Ладно, я не смог себя удержать, добавил в товой код 1 строку
"if(item.type=='hidden'&&item.value=='reload'&&Number(resp)==1)location.reload();\n"
"else if(item.type=='checkbox'||item.type=='radio')item.checked=Number(resp);\n"
Немного поправил свой hiidenn (id добавил)
void HIDDEN(const String& name, const String& value) {
String s;
s.reserve(60);
s += F("<input type=hidden name='");
s += name;
s += F("' id='");
s += name;
s += F("' value='");
s += value;
s += F("'>");
SEND(s);
}
В конструкторе пишу следующее
BUILD_BEGIN();
GP.THEME(GP_DARK);
GP.UPDATE("WebPage",3000);
GP.HIDDEN("WebPage","reload");
в обработчике
if (portal.updateName().startsWith("WebPage")){
portal.answer(1);
}
Так страница обновляется каждые 3 секунды
если сделать portal.answer(10);
Страница больше не обновляется, значит всё как надо, ответ на запрос обновляет страницу.
Скажем так, я что смог придумать - придумал, проверил, обкатал. Если будет полезно, то я рад.
Если не добавят в библу, я не расстроюсь:) Себе я уже сделал
Немного не понял, каким образом jquery обновляет данные без запросов к action. Откуда берутся данные? Это ведь невозможно)
Скажем так, я что смог придумать - придумал
Не очень понимаю зачем были такие свистопляски, если мы в прошлый раз вроде бы сошлись на setInterval()
<script>setInterval(function(){location.reload();},1000);</script>
И всё
Скрипт $('#id1').load('# #id1'); делает загрузку всей страницы (используя только функцию конструктора), а в браузер вываливает только то, что в блоке
<div =id1>ВСЁ ЧТО МЕЖДУ ТЕГАМИ</div>.
При этом делает это незаметно, ничего не дёргается, все элементы просто подменяются.
Не очень понимаю зачем были такие свистопляски, если мы в прошлый раз вроде бы сошлись на setInterval()
И всё
Если так чделать, то страница будет всегда перезагружаться, браузер будет её ребутить постоянно, а так не надо делать, это прям не хорошо.
В моём варианте будет запрос в action, и если придёт время обновлять страницу (допустим по датчику, или по нажатию на кнопку со стороны контроллера), обработчик на данный запрос должен отдать циферку 1, в противном случае пусть отдаёт 0 или что нить другое.
Как только браузер в ответ получит 1, он с помощью явы обновит страницу целиком. А код конструктора сформирует ту страницу, которая должна выходить. В конструкторе просто надо сделать условие, что то типа:
Если нажата кнопка, делаем эту страницу, если нет, то делаем другие страницы.
Из всего кода, я просто в builder.h, там, где собирается ajax_update добавил вот эту строку:
"if(item.type=='hidden'&&item.value=='reload'&&Number(resp)==1)location.reload();\n"
А скрытый hidden нужен просто для привязки через функции скрипта getelemenbyid
Поскольку я на php всегда ипользовал jquery для обновления, то я долго не мог понять как работает твоё обновление, и так же упорно себя спрашивал, нафига делать какие-то ответы в обработчике, если есть конструктор... Потом до меня стало доходить. Наверное именно по этому я и просил добавить value в чекбокры и радио. Вообще не догонял как без них, ведь как по мне всё должен делать именно конструктор...
делает загрузку всей страницы
теперь понятно
всё должен делать именно конструктор
конструктор - тяжёлая артиллерия. Для пары блоков лучше передавать конкретные данные напрямую тому кто просит
добавить value в чекбокры и радио
сейчас по сути они не нужны, даже для jquery? У меня всё работает без них
это я понимаю, что не нужны, просто я когда ловлю клик от свитча, я по факту ловлю именно по какому бы счёлкнут, по включенному, или по выключенному, когда есть обновления 1 раз в секунду - это одно, а если сделать раз в 3 секунды и нажимать на кнопки с разных компов или телефонов.... тогда захотев включить, можешь выключить, и/или наоборот.
По поводу упдейта по jquery, я не на что не претендую. просто сколько тиков должен сделать портал чтобы отработать обновления 9ти элементов по твоему способу, и сколько тиков через jquery, если все 9 элементов будут в одном div?
всё зависит от применения, Я в итоге сделал 2 способа обновления, в одном месте я подрубаю jquery, в другом ajax.
Просто как способ, я скорее от любопытства, меня в принципе и твой способ устаревает. Я ж говорю, портал ОГОНЬ! Я в твоём коде ориентируюсь уже лучше, чем в своём:)
я осознал как работает jquery обновление, это очень круто. Было бы ещё круче выдрать из библиотеки обновлялку и вставить в код, чтобы не тащить весь файл.
я по факту ловлю именно по какому бы счёлкнут
у меня клик по свитчу и чекбоксу передаёт состояние, 0 или 1
То есть ты для передачи данного состояния сделал отдельную обработку на яве? При этом лишив возможности юзать данные элементы в формах? Всё это вместо того, чтобы добавить на эти эелементы value и обрабатывать их как обычные ?
я осознал как работает jquery обновление, это очень круто. Было бы ещё круче выдрать из библиотеки обновлялку и вставить в код, чтобы не тащить весь файл.
Думаю это не реально, там функция за функцию, я сегодня уже подумал так же, проще добавить возможность подгрузки jquery с официальных сайтов, а в случае автономного использования придётся грузить всё... Есть на официальном сайте jquery юолее понятная с форматированием, я реально сегодня обалдел от этого файла, лично у меня бы духу не хватило это сделать.
Ну и как плюшка, у jquery тонна функционала, там и графики и ещё что то, красивости, вякие json парсеры и прочее, что иногда требуется
При этом лишив возможности юзать данные элементы в формах?
Я ведь в прошлом ишью написал, как это работает, и приложил цитату из документации. Радио и чекбоксы работают по другой логике
Ребят, может вам созвонится и обсудить эти моменты?)
Тяжко в чате идет понимание...
Тяжко в чате идет понимание
всё идёт более чем замечательно
Я до сих пор не догнал в чём затык с радио, хоть и 5 раз перечитал наш диалог, но это всё от моей убогости:) То, что чекбокс ничего не отдаёт с формы, когда все чекеты сняты?
Кажется сейчас начинаю догонять. Просто в php обычно юзаю isset(), и подобные штуки в обработчиках спокойно можно учесть. Здесь да, здесь я согласен, посложнее получается. Тяжело мне так, кто бы знал, мой мозг ломается на куски.
всё идёт более чем замечательно
Поддерживаю, более чем замечательно!
так в итоге есть проблема с чекбоксами или нет? У меня в рабочей версии их нет, вроде как в любых сценариях
как правильно ловить их в обработчике?
Я сейчас ловлю так:
if (portal.clickName().startsWith("SWidrelay@")){
int idrelay=portal.clickName().substring(portal.clickName().lastIndexOf("@")+1).toInt();
CoreGR.setStateRelay(idrelay,portal.getInt(portal.clickName()));
}
я ловлю свой value, или то, что твои скрипты подставляют?
Вот тут я его ловлю
portal.getInt(portal.clickName())
Кажется это то, что твоя ява подставляет, вопрос снят, валуе нафиг не надо. Дома буду, проверю на практике.
неправильно, чекбокс ловится как getCheck
как раз из за особенности чекбокса, потому что он может вернуть "on"
интересненько...
это я ловлю switch
GP.SWITCH("SWidrelay@"+String(h), CoreGR.getStateRelay(h));
при этом добавил
void SWITCH(const String& name, bool x = 0, bool dis = false) {
String s;
s.reserve(100);
s += F("<label class='switch'><input type='checkbox' name='");
s += name;
s += F("' id='");
s += name;
s += "' value='";
s += x;
s += "' ";
if (x) s += F("checked ");
if (dis) s += F("disabled ");
s += F("onclick='GP_click(this)'>\n");
s += F("<span class='slider'></span></label>");
SEND(s);
}
И так у меня всё работает, переделаю свой код, проверю, говорю же, мозг ломается
у меня в каждую форму сейчас добавляется скрытый dummy элемент, без него форма в принципе не хочет отдавать значения чекбоксов, если в форме только они и все выключены
а может в обработчик надо сделать нечто типо !isset(). Типо если не пришёл, то делаем следующее.
Что будет, если запросить portal.getString(chekbox), с формы, где не пришёл чекбокс? тут в php спасает явное равенство, которые может отличить ноль от лжи (===false или !==false).
Блин, работает же сейчас, нафиг трогать, я у себя подправлю, догнал как.
А с обновлениями что делать? Надо сюда Дениса, может у него хватит сил и времени выдергнуть код из jquery, я в принципе не воспринимаю код Явы, меня прям от него в дрожь бросает, а он кажется очень его любит
и да, поддерживаю вопрос с пробелами, как не странно, но в своей жизни натыкался на эти грабли 100500 раз, надо дёргнуть его предложение в отдельный ишью
Я новачок в усём, просто понимаю более мение и он поход на с++, а в отстальном гугл)
запросить portal.getString(chekbox), с формы, где не пришёл чекбокс?
Будет беда. Вообще парсинг в текущей версии крайне убогий, я у себя в рабочей уже сделал новый компактный и безопасный парсинг, потом дам пощупать
Я новачок в усём, просто понимаю более мение и он поход на с++, а в отстальном гугл)
Все тут:) сразу в отказную блин...
Чесно говоря я только пол года с ардуино и с++ просто сильно уроки AlexGyver помогли понять логику, с++ лёгкий (основы) а javascript похожий на первый взгляд. Но библиотека слишком большая)
я нашел нужную функцию
откройте https://code.jquery.com/jquery-3.6.1.js
нажмите cntrl + f
и вставте в пошук Load a url into a page
вроде она
это я тоже нашёл, тольк она тянет за собой кучу всего
один jqXHR, и он за собой тянет ещё, и так как в Аду, а тма ещё тьма подобного
Если контроллер высынут в инет, то просто берём и подключаем библу на стороне, если как точка доступа, то качаем в память файл. В принципе 100 килобайт не так и много, у меня вообще вся память свободна, 2 файла конфига по 6 килобайт плюс jquery, остальное просто так, для красоты
это можно но будет на треть меньше, это просто сложно и не оправдано
Если контроллер высынут в инет, то просто берём и подключаем библу на стороне, если как точка доступа, то качаем в память файл. В принципе 100 килобайт не так и много, у меня вообще вся память свободна, 2 файла конфига по 6 килобайт плюс jquery, остальное просто так, для красоты
ну да
я сделаю примерно так же как с иконками и графиками - возможность грузить и оттуда и оттуда. Какой стоковый url для загрузки jquery? Желательно minified версию
кому нужно будет больше места пусть SD подключают) как я😁
я сделаю примерно так же как с иконками и графиками - возможность грузить и оттуда и оттуда. Какой стоковый url для загрузки jquery? Желательно minified версию
и что бы его в папку с графиками впихнуть)
я сделаю примерно так же как с иконками и графиками - возможность грузить и оттуда и оттуда. Какой стоковый url для загрузки jquery? Желательно minified версию
https://jquery.com/download/
там все варианты
То есть вот это https://code.jquery.com/jquery-3.6.1.min.js 90 кило
ДА
https://github.com/thijse/Arduino-EEPROMEx/blob/master/extras/Documentation/html/jquery.js
нашел через поиск в библиотеках, подойдет?)
нашел через поиск в библиотеках, подойдет?
конечно же нет... зачем искать какие то левые файлы, когда есть официальный сайт
Так, по вопросу jquery апдейта. А нужно ли деление страницы на див-блоки? Может просто передать в скрипт id общего блока страницы, который формирует build_begin? А функция jquery update будет просто добавлять кусок скрипта в код, и можно будет вызвать его на нужной странице или по условию в билдере. Это сильно упростит код на фронтенде, буквально до JQUERY_UPDATE(период) и всё
не не не, я уже говорил про это обновление и формы. Исключительно в дивы пихать.
я не думаю, что это так сложно. Честно. Проще уже не придумать.
Я считаю, что внутри формы обновляющихся компонентов в принципе быть не должно. Форма - статический инструмент, ты ее загрузил, поменял руками что нужно, отправил обратно. Иначе причинно следственная связь нарушается. Нужно менять в реальном времени - клик+адпейт.
Исходя из этого, можно в несколько раз всё упростить и объединить все jq обновление в один компактный скрипт, с оговоркой "не использовать на этой странице формы". Кстати что будет, если врубить форму внутри див апдейта?
Тогда давай так, делаем обновление только div id=jqUpd
А ставить его можно будет только один раз, типо
GP.UPD_BEGIN()
GP.UPD_END()
и их передавать без параметров
А кто куда его будет пихать, это уже всё равно! Главное что такая возможность есть, кто то будет всё обновлять, кто то будет обновлять только частичку на экране
Все равно чувствуется лишнее, но уже лучше. И в Бегин передавать период, Бегин также вписывает скрипт. И можно рандомный айди выдавать сразу
И как раз я смогу в макрос обернуть чтобы энд() не писать
В принципе норм вариант, только без рандомного id, при этом конструировать их через pstr
Сейчас не понял)
И как раз я смогу в макрос обернуть чтобы энд() не писать
ЕНД надо, хоть убей!
В begin передавать имя и период?
ЕНД надо, хоть убей!
Нет, не надо. Если сделать макрос, как я в прошлом ишью показывал
Да, давай немного притормозим, я до дома добегу, я и попробую своё компромиссное видение накидать
Нет, не надо. Если сделать макрос, как я в прошлом ишью показывал
Но ведб он до конца страницы после бегина всё будет обновлять, а если у меня под светодиодами form_submit_hidden, то этот submit будет глюкавить (особенно если в нём есть изменени цвета)
Я у себя сегодня уже ловил этот глюк
Нет. Макрос добавляет Бегин, указанные блоки, и энд. Это на уровень выше чем просто си-код в скетче
Условно есть у нас
Begin()
Block1();
Block2();
.........
End();
Можно сделать макрос
#define make(args) Begin(); args; End();
И этот макрос будет разворачиваться в код. Код выше сократится до
make(Block1(); Block2(););
И всё
блин, очень интересно, но не понял. Надо вики пилить и новую библу выкладывать. Если с помощью этого можно будет сделать нечто подобное
GP.FORM_BEGIN(portal.uri());
GP.LABEL("Имя реле:");
GP.TEXT("NameRelay", "Введите имя реле", NameRelay[idrelay]);GP.BREAK();
GP.LABEL("Номер реле:");
GP.NUMBER("pinRelay", "Введите номер реле", pinRelay[idrelay]);GP.BREAK();
GP.LABEL("Модуль:");
GP_SELECT_ARRAY("addressRelay",*NameModule,NameModuleLenght,ModuleCount,addressRelay[idrelay]);GP.BREAK();
GP.LABEL("Комната:");
GP_SELECT_ARRAY("RoomRelay",*NameRooms,NameRoomsLenght,RoomsCount,RoomRelay[idrelay]);GP.BREAK();
GP.DIV_BEGIN("LedSW");
GP.LED_RED("LedRedRelay@"+String(idrelay),!CoreGR.getStateRelay(idrelay));
GP.SWITCH("SWidrelay@"+String(idrelay), CoreGR.getStateRelay(idrelay));
GP.LED_GREEN("LedGreenRelay@"+String(idrelay),CoreGR.getStateRelay(idrelay));
GP.DIV_END();
GP.SUBMIT("Применить");
GP.FORM_END();GP.BREAK();
GP.BUTTON_LINK("/settings/relay", "Назад");
то пусть так и будет
Что угодно можно. Это просто уменьшает количество кода в скетче, а также сразу форматирует содержимое блоков на одну табуляцию вправо
Понимаешь, я сделал форму по настройке реле, но чтобы не запутаться, мне надо сделать так, чтобы я из формы потыкал на кнопку и убедился, что это именно то самое реле, которое я настраиваю.
Надо вики, надо в релиз...