Dobrý den,
vytvářím webserver na esp8266 potřebuju vytvořit textová pole, do kterého je zapisovaná hodnota uživatelem. Po změně se hodnota auto. uloží a načte uložená pro kontrolu = obnova stránky. Bohužel hodnota se ukládá nepravidelně i když dojde k obnově stránky načte se původní hodnota. Hodnota se uloží vždy pokud kliknu myší na tlačítko. Přitom dochází k dvojité obnově stránky. Tlačítko taky funguje až po dvoukliku. Kde je problém?
Na tlačítko používám kod:
client.println("<p>Zpoždění: <input type=\"number\" name=\"txt\" value=\"" +
String(EEPROM.read(1)) + "\" onchange=\"setTimer(this.value)\" min=\"10\" max=\"40\"> s (25s)</p>");
+ tento kod, který se bohužel neprovede při změně (výjimečně nebo pokud kliknu na tlačítko).
if(header.indexOf("GET /?timer=") >= 0) {
pos1 = header.indexOf('=');
pos2 = header.indexOf('&');
valueString = header.substring(pos1+1, pos2);
timer = valueString.toInt();
EEPROM.write(1, timer);
EEPROM.commit();
Serial.println(valueString);
pro zpracování požadavku používam tento kod:
client.println("<script> function setTimer(value) { var xhr = new XMLHttpRequest();");
client.println("xhr.open('GET', \"/?timer=\" + value + \"&\", true);");
client.println("xhr.send(); location.reload(true); } ");
webserver na ESP8266
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Re: webserver na ESP8266
Jaký dává smysl dělat ajaxový request a pak volat reload stránky? Proč tedy neděláš normální request?
A když už to chceš dělat takto, tak samozřejmě ten reload musíš udělat, až jakmile ten ajax doběhne, takto se nemusí stihnout vykonat a může se stornovat, proto se Tě to asi ukládá jen někdy...
K dvojkliku na tlačítko se nevyjadřuju, protože v zaslané ukázce žádné tlačítko není...
A když už to chceš dělat takto, tak samozřejmě ten reload musíš udělat, až jakmile ten ajax doběhne, takto se nemusí stihnout vykonat a může se stornovat, proto se Tě to asi ukládá jen někdy...
K dvojkliku na tlačítko se nevyjadřuju, protože v zaslané ukázce žádné tlačítko není...
Re: webserver na ESP8266
Tlačítko přepínač funguje obdobně, ale je to asi stejný problém jak u text pole:
grafika:
provedení:
Kód: Vybrat vše
else if(header.indexOf("GET /?state=on") >= 0) {
outputOn();
}
else if(header.indexOf("GET /?state=off") >= 0) {
outputOff();
}Kód: Vybrat vše
if(outputState == "off") {
client.println("<p><button class=\"button\" onclick=\"outputOn()\">ON</button></p>");
}
else {
client.println("<p><button class=\"button button2\" onclick=\"outputOff()\">OFF</button></p>");
}Kód: Vybrat vše
client.println("function outputOn() { var xhr = new XMLHttpRequest();");
client.println("xhr.open('GET', \"/?state=on\", true);");
client.println("xhr.send(); location.reload(true); } ");
client.println("function outputOff() { var xhr = new XMLHttpRequest();");
client.println("xhr.open('GET', \"/?state=off\", true);");
client.println("xhr.send(); location.reload(true); } ");Re: webserver na ESP8266
Už tomu rozumím, ale nevím jak to mám zapsat, nějaký typ bez překopání celého kodu?
Re: webserver na ESP8266
Kód: Vybrat vše
function complete() {
location.reload(true);
}
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", complete);
xhr.open('GET', \"/?state=off\", true);
xhr.send();
ale zaregistruješ si funkci "complete" jako událost, kdy se response zcela načte, tedy ajax v plné míře doběhne.
Kdo je online
Uživatelé prohlížející si toto fórum: Bing [Bot] a 1 host