GP.UPDATE GP.RELOAD
DAK85 opened this issue · 24 comments
Сразу к делу. Можете меня убивать.
вот код, как сейчас работает 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')
Только сможешь сам проверить?
Я сейчас не в том месте не в то время
:(
Надо будет проверить любой пример с обновлением, чтобы не поехал упдейт. А на релоад надо всегда отвечать 0 и смотреть, чтобы hidden value=select
тогда лучше
if(item.type!='hidden'&&item.value!='reload')
можно и так наверное, чёт я видать сегодня совсем заремонтировался
если не ответить на релоад - там автоматически null отправится
ну как вариант отвечать reload если не 1
так падажжи. Лучше просто if(item.type=='hidden'&&item.value=='_reload'){if(resp=='1')location.reload();}
тоже верно, но я боюсь уже этого скрипта. Главное чтобы он нигде ниже value не поменял:)
у меня опять вылезла проблема с чекбоксами. Жопу рвёт просто. При сабмите если чек не чекнут - его имени просто нет в параметрах 🤬🤬🤬🤬🤬🤬 это ломает некоторую логику
У меня жопу рвало от этого на php. Всем чекам надо было давать одинаковое имя и потом через POST браузер посылал массив из выбранных значений.
<name=ar1 typ......................value=12> 12
<name=ar1 typ......................value=13> 13
<name=ar1 typ......................value=14> 14
Если будет чекнут 12, 13 то должен прилетить массив ar1{12,13}, но тут это так просто не сделаешь на сколько я понимаю
а как ты хочешь?
если не чекнут, то с него что должно прилетать? 0? тогда я бы копал в сторону возможности создания явой скрытого чека с таким же именем но со значением 0, при этом явой устанавливать чек на скрытый элемент, если созданный элемент не отмечен и снимать чек, если он чекнут.... но это нифига не просто
короче всё оказалось просто - у есп разбор запроса идёт по first occurrence, то есть нужно просто добавить после чекбокса <input type="hidden" value='0' name="checkName">
только что хотел предложить, это всегда так в html, если 2 одинаковых имени прилетает, берётся только первое
походу не всегда, в некоторых бэкэндах берётся последнее
интересно конечно, но если браузер через пост отдаёт, то он отдаёт первое значение.
так смотри ещё предложение: апдейт запаковать в скрипты в виде функции. Без использования файла и без использования апдейта страница станет тяжелее. С файлом будет пофиг, а с файлом и апдейтом размер сильно уменьшится
короче, я тут переделал апдейт) он теперь работает как твой на jquery (обновляет всё за один запрос), но через ajax. Логика такая:
- setInterval отсылает на есп список обновления из функции
- есп его парсит и в цикле вызывает action
- в данном случае answer() прибавляет значение к строке
- и прибавляется запятая
- затем есп отправляет пакет значений (разделённых запятой)
- браузер его парсит
- имея список id и список значений браузер циклом дёргает компоненты и присваивает новые значения
Работает просто невероятно как шустро)
Супер, гквери можно выкинуть после этого. Хотя нет, гквери же из конструктора без ответа делает страницу
Ещё бы придумать как авторебут после клика добавлять как ты добавляем подсказки на элементы... А то тут мне в спинере понадобился ребут после нажатия
Ой ей...
Если ты про авторебут, то не стоит с этим заморачиваться, однако надо сделать ишью по идеям на следующий релиз, так как появляются идеи, которые надо куда-то девать.... А потом уже разбирать. Может сделаем ишью по идеям и по Вики и сразу их закроем, чтобы никто их не видел....
По идеям сделал, по Вики рано