GyverLibs / GyverPortal

Простой конструктор веб интерфейса для esp8266 и ESP32
MIT License
309 stars 25 forks source link

GP.UPDATE GP.RELOAD #44

Closed DAK85 closed 2 years ago

DAK85 commented 2 years ago

Сразу к делу. Можете меня убивать. вот код, как сейчас работает gp.update()

void UPDATE(const String& list, int prd = 1000) {
        *_gp_page += F("<script>setInterval(function(){\n");
        *_gp_page += "var ids='";
        *_gp_page += list;
        *_gp_page += F("'.split(',');\n"
        "ids.forEach(function(id){\n"
        "var xhttp=new XMLHttpRequest();\n"
        "xhttp.onreadystatechange=function(){\n"
        "if(this.readyState==4&&this.status==200){\n"
        "var resp=this.responseText;\n"
        "var item=document.getElementById(id);if(item==null)return;\n"
        "if(item.type=='hidden'&&item.value=='reload'&&resp=='1')location.reload();\n"
        "else if(item.type=='checkbox'||item.type=='radio')item.checked=Number(resp);\n"
        "else if(item.type=='select-one')document.querySelector('#'+id).value=resp;\n"
        "else if(item.type==undefined)item.innerHTML=resp;\n"
        "else item.value=resp;\n"
        "if(item.type=='range')GP_change(item);\n"
        "}};xhttp.open('GET','/GP_update?'+id+'=',true);xhttp.send();});},");
        *_gp_page += prd;
        *_gp_page += F(");</script>\n");
        send();
    }

Если мы ставим GP.RELOAD() и начинаем его обновлять, и не дай Бог мы в обработчике на обновление GP.RELOAD ответим отличным от 1... то тогда "if(item.type=='hidden'&&item.value=='reload'&&resp=='1')location.reload();\n" не сработает и как вишенка на торте "else item.value=resp;\n" ' эта строка поменяет значение скрытой формы, то есть было value=reboot, станет value=1.


void UPDATE(const String& list, int prd = 1000) {
        *_gp_page += F("<script>setInterval(function(){\n");
        *_gp_page += "var ids='";
        *_gp_page += list;
        *_gp_page += F("'.split(',');\n"
        "ids.forEach(function(id){\n"
        "var xhttp=new XMLHttpRequest();\n"
        "xhttp.onreadystatechange=function(){\n"
        "if(this.readyState==4&&this.status==200){\n"
        "var resp=this.responseText;\n"
        "var item=document.getElementById(id);if(item==null)return;\n"
        "if(item.type=='hidden'&&item.value=='reload'&&resp=='1')location.reload();\n"
        "else if(item.type=='checkbox'||item.type=='radio')item.checked=Number(resp);\n"
        "else if(item.type=='select-one')document.querySelector('#'+id).value=resp;\n"
        "else if(item.type==undefined)item.innerHTML=resp;\n"
"else if(!(item.type=='hidden'&&item.value=='reload'))item.value=resp;\n"
        "if(item.type=='range')GP_change(item);\n"
        "}};xhttp.open('GET','/GP_update?'+id+'=',true);xhttp.send();});},");
        *_gp_page += prd;
        *_gp_page += F(");</script>\n");
        send();
    }

Сейчас не могу потестировать, но по моим ощущения это должно решить проблему. Нужен взгляд со стороны
GyverLibs commented 2 years ago

ох блин...

GyverLibs commented 2 years ago

добавил только "else if(!(item.type=='hidden'&&item.value=='reload'))item.value=resp;\n" ? Тогда поддерживаю

GyverLibs commented 2 years ago

тогда лучше if(item.type!='hidden'&&item.value!='reload')

DAK85 commented 2 years ago

Только сможешь сам проверить? Я сейчас не в том месте не в то время :( Надо будет проверить любой пример с обновлением, чтобы не поехал упдейт. А на релоад надо всегда отвечать 0 и смотреть, чтобы hidden value=select

DAK85 commented 2 years ago

тогда лучше if(item.type!='hidden'&&item.value!='reload')

можно и так наверное, чёт я видать сегодня совсем заремонтировался

GyverLibs commented 2 years ago

если не ответить на релоад - там автоматически null отправится

DAK85 commented 2 years ago

ну как вариант отвечать reload если не 1

GyverLibs commented 2 years ago

так падажжи. Лучше просто if(item.type=='hidden'&&item.value=='_reload'){if(resp=='1')location.reload();}

DAK85 commented 2 years ago

тоже верно, но я боюсь уже этого скрипта. Главное чтобы он нигде ниже value не поменял:)

GyverLibs commented 2 years ago

у меня опять вылезла проблема с чекбоксами. Жопу рвёт просто. При сабмите если чек не чекнут - его имени просто нет в параметрах 🤬🤬🤬🤬🤬🤬 это ломает некоторую логику

DAK85 commented 2 years ago

У меня жопу рвало от этого на php. Всем чекам надо было давать одинаковое имя и потом через POST браузер посылал массив из выбранных значений.

DAK85 commented 2 years ago
<name=ar1 typ......................value=12> 12
<name=ar1 typ......................value=13> 13
<name=ar1 typ......................value=14> 14

Если будет чекнут 12, 13 то должен прилетить массив ar1{12,13}, но тут это так просто не сделаешь на сколько я понимаю

DAK85 commented 2 years ago

а как ты хочешь? если не чекнут, то с него что должно прилетать? 0? тогда я бы копал в сторону возможности создания явой скрытого чека с таким же именем но со значением 0, при этом явой устанавливать чек на скрытый элемент, если созданный элемент не отмечен и снимать чек, если он чекнут.... но это нифига не просто

GyverLibs commented 2 years ago

короче всё оказалось просто - у есп разбор запроса идёт по first occurrence, то есть нужно просто добавить после чекбокса <input type="hidden" value='0' name="checkName">

DAK85 commented 2 years ago

только что хотел предложить, это всегда так в html, если 2 одинаковых имени прилетает, берётся только первое

GyverLibs commented 2 years ago

походу не всегда, в некоторых бэкэндах берётся последнее

DAK85 commented 2 years ago

интересно конечно, но если браузер через пост отдаёт, то он отдаёт первое значение.

GyverLibs commented 2 years ago

так смотри ещё предложение: апдейт запаковать в скрипты в виде функции. Без использования файла и без использования апдейта страница станет тяжелее. С файлом будет пофиг, а с файлом и апдейтом размер сильно уменьшится

GyverLibs commented 2 years ago

короче, я тут переделал апдейт) он теперь работает как твой на jquery (обновляет всё за один запрос), но через ajax. Логика такая:

Работает просто невероятно как шустро)

DAK85 commented 2 years ago

Супер, гквери можно выкинуть после этого. Хотя нет, гквери же из конструктора без ответа делает страницу

DAK85 commented 2 years ago

Ещё бы придумать как авторебут после клика добавлять как ты добавляем подсказки на элементы... А то тут мне в спинере понадобился ребут после нажатия

GyverLibs commented 2 years ago

Ой ей...

DAK85 commented 2 years ago

Если ты про авторебут, то не стоит с этим заморачиваться, однако надо сделать ишью по идеям на следующий релиз, так как появляются идеи, которые надо куда-то девать.... А потом уже разбирать. Может сделаем ишью по идеям и по Вики и сразу их закроем, чтобы никто их не видел....

GyverLibs commented 2 years ago

По идеям сделал, по Вики рано