GyverLibs/GyverPortal

GP.UPDATE GP.RELOAD

DAK85 opened this issue · 24 comments

DAK85 commented

Сразу к делу. Можете меня убивать.
вот код, как сейчас работает 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();
    }

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

ох блин...

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

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

DAK85 commented

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

DAK85 commented

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

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

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

DAK85 commented

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

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

DAK85 commented

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

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

DAK85 commented

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

DAK85 commented
<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

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

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

DAK85 commented

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

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

DAK85 commented

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

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

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

  • setInterval отсылает на есп список обновления из функции
  • есп его парсит и в цикле вызывает action
  • в данном случае answer() прибавляет значение к строке
  • и прибавляется запятая
  • затем есп отправляет пакет значений (разделённых запятой)
  • браузер его парсит
  • имея список id и список значений браузер циклом дёргает компоненты и присваивает новые значения

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

DAK85 commented

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

DAK85 commented

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

Ой ей...

DAK85 commented

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

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