Наступил на грабли. Checkbox передается в запросе только если он checked, иначе ничего не передается. Что бы понять, что за запрос приходится добавлять фиктивный параметр. 5 фиктивных параметров мне показалось слишком жирно. В итоге сделал одну форму, один post запрос. Вот что получилось:
#include <SPI.h>
#include <Ethernet.h>
#include "HTML.h"
#include "request.h"
#include <avr/pgmspace.h>
Crequest request;
const char PROGMEM Ok[]={\
"HTTP/1.1 200 OK\r\n"\
"Content-Type: text/html\r\n"\
"\r\n\0"\
};
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 198);
EthernetServer server(80);
EthernetClient client;
//-------- твои переменные -----------
boolean manauto=1, light=1, filter=0, air=0, hiter=0;
void setup()
{
//Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
request.init();
}
void send(const char *ptr)
{
char c;
while(c=pgm_read_byte(ptr++)) client.print(c);
//здесь по хорошему символы надо в буфер собирать, а затем отправлять клиенту
}
void sendjs()
{
/*
//на стороне клиента должна получиться такая функция
function setVars()
{
document.getElementById('manauto').checked=1;
document.getElementById('light').checked=0;
document.getElementById('filter').checked=0;
document.getElementById('air').checked=0;
document.getElementById('hiter').checked=0;
}
*/
String s;
client.println("function setVars(){");
s="document.getElementById('manauto').checked="+manauto?"1;":"0;"; client.println(s);
s="document.getElementById('light').checked=" +light? "1;":"0;"; client.println(s);
s="document.getElementById('filter').checked=" +filter? "1;":"0;"; client.println(s);
s="document.getElementById('air').checked=" +air? "1;":"0;"; client.println(s);
s="document.getElementById('hiter').checked=" +hiter? "1;":"0;"; client.println(s);
client.println("}");
}
void setVars()
{
String s=request.param();//получаю строку параметров из запроса
manauto=(s.indexOf("manauto=on")!=-1);
light =(s.indexOf("light=on") !=-1);
filter =(s.indexOf("filter=on") !=-1);
air =(s.indexOf("air=on") !=-1);
hiter =(s.indexOf("hiter=on") !=-1);
}
void loop()
{
client = server.available();// listen for incoming clients
if (client)
{
while (client.connected())
{
if (client.available() && request.received(client.read()))
{
switch (request.type())
{
case GET: send(Ok); send(html); break;
case GETJS: send(Ok); sendjs(); break;
case POST: setVars(); send(Ok); send(html); break;
default: break;
}
break;
}
}
client.stop();
request.init();
}
}
Строчка 233 "<tr><td><input type='hidden' name='tmp'><input type='submit' value='Отправить'></td></tr>" отправдяет выбранные выше положения переключателей? Если да, то как-то не очень красиво получается.
Медленно, но верно приходит озарение, особенно к утру. Проблема в том, что в файле request.h в строке 11 мы присваиваем reqType=0; и возвращаем в 12 строке этот ноль в type. А для 0 у нас не указан switch.
Но этого не должно быть, значит либо приходит запрос, которого мы не ожидали, либо мы не правильно разбираем нужный нам запрос. Вставь Serial.println(s); в функцию LookForKeyWord(). Посмотри, как выглядит запрос.
Serial.begin(); не забыл раскомментировать в setup()?
Не забыл, без него монитор вообще не выводит ничего.
Andy пишет:
Коммент #28по-прежнему актуален.
А вот после этого, страничка загрузилась. Но теряется весь вид, из-за наличия кнопки отправить.
После выбора необходимых комбинаций кнопок и нажатия кнопки отправить, строка браузера имеет такой вид 192.168.1.198/#, на сколько я понимаю там должно передваться состояние всех кнопок.
Все же предлагаю сделать отправку состояния каждой отдельной кнопки и избавиться от лишней кнопки "передать".
Теперь можно приступать к написанию исполнительной части?
После выбора необходимых комбинаций кнопок и нажатия кнопки отправить, строка браузера имеет такой вид 192.168.1.198/#, на сколько я понимаю там должно передваться состояние всех кнопок.
Состояние кнопок передается POST запросом и потому не видно, если в html коде заменить POST на GET, тогда состояние кнопок можно увидеть в адресной строке.
mozgolomys пишет:
Все же предлагаю сделать отправку состояния каждой отдельной кнопки и избавиться от лишней кнопки "передать".
Я пробовал отправлять запрос по onClick, но беда в том, что если checkbox в состоянии reset, то запрос пустой и не возможно определеить от какой кнопки пришел. Приходится добавлять фиктивный параметр. Если тебя не пугает 5 фиктивных параметров, можно сделать и так.
mozgolomys пишет:
Теперь можно приступать к написанию исполнительной части?
Я думал это все уже реализовано.... сделай отдельным модулем.
Фиктивный параметр это String param(){return s;}? Для чего он нам нужен, если можно, чуть подробнее?
Это функция возвращающая строку содержащую POST запрос. Вызывается в строке 64.
Фиктивный параметр в html коде строка 233 <input type='hidden' name='tmp'>, он передается в форме всегда, когда все чекбоксы в состоянии reset, в запросе передается только этот параметр.
Проблема в том, что в мониторе порта вижу отклик на действие кнопок manual=on, но в теле html не получается написать условие типа:
if (manual==1){
[for='manauto']:after;
}else{
[for='manauto']:before;
}
Выдает ошибку и просит поставить { перед if. Может быть это надо как-то по другому записать.
Т.е. при нажатии на кнопку режим работы, кнопка после обновления страницы, возвращается в исходное состояние. А мне нужно что бы после обновления страницы состояния других кнопок не менялось. А той, которая вызвала обновление - изменилось. Наверное как-то сумбурно получилось.
Выдает ошибку и просит поставить { перед if. Может быть это надо как-то по другому записать.
Не пойму, где ты хочешь это реализовать, если в стилях, то CSS не поддерживает if/else, если в скриптах, то к стилям надо по другому обращаться.
В нашей реализации состоянием переключателей управляет javascript, а он исполняется после полной загрузки html страницы. Поэтому при каждой перезагрузке страницы, мы будем видеть сначала исходное состояние переключателей, а затем после выполнения скрипта - их реальное состояние. Если не нравится эта перерисовка, тогда надо либо модифицировать html на лету, либо перенести форму в iFrame, либо использовать ajax запросы.
У меня другая проблема. Мне не очень нравится реализация передачи состояния всех кнопок, отдельной кнопкой. Мы по этому поводу говорили выше. Я ввел состояние кнопок manual/avto, filteron/filteroff, airon/airoff и т.д. Но для того, что бы передать состояние кнопки после изменения ее значения, я добавил перезагрузку страницы
И состояние кнопок перестало фиксироваться. Мне нужно как-то добавить условие, если manual==1 то переключить переключатель в состояние manual, если manual==0, то переключатель должен быть в режиме avto.
Давай по шагам. Положи html файл на локальный диск. Измени <form method="get", что бы видеть запросы прямо в адресной строке. Открой его в браузере. Нажимай на кнопки, форма должна отправляться при нажатии на любую кнопку, в зависимости от кнопки, в адресной строке должно появляться, что-то вроде этого:
Страница обновляется, но состояние кнопок пока исходное. Верни <form method="post". Перенеси html в проект. Теперь браузером обращайся к дуине. Смотри, как она отрабатывает manauto=on, как генерит javascript, появляется ли в скрипте: document.getElementById('manauto').checked=1; как браузер исполняет этот скрипт, меняется ли состояние переключателя после исполнения скрипта.
Понял, проблема вот в чем:
"<td><input type='checkbox' id='manual' name='manual' onClick='this.form.submit()'/><label for='manual'>AUTO</label></td>"\
Я нажимаю на кнопку и получаю в serial monitor - manual=on, нажимаю еще раз и снова получаю то же самое. Нужно как-то в html написать условие, что если нажали на переключатель, то manual=on, а если еще раз нажали на переключатель, то avto=on. И что бы на экране положение кнопки менялось.
Нашел такое условие для html:
<!--#if expr="УСЛОВИЕ1" -->
HTML-код, который будет выводиться,
если УСЛОВИЕ1 истинно
<!--#elif expr="УСЛОВИЕ2" -->
HTML-код, который будет выводиться,
если УСЛОВИЕ1 ложно,
а УСЛОВИЕ2 истинно
<!--#else -->
HTML-код, который будет выводиться,
если все условия ложны
<!--#endif -->
Но компилятор выдает ошибки, то на #, то просит какую-то {, хотя все есть. Наверное что-то в написании.
Что-то я не понимаю, как должна быть связана работа html кнопки и передача post запроса, т.к. у нас кнопка перемещается (визуально меняет состояние), только из-за того что работает css селектор, который визуально перемещает кнопку на заданную координату. Т.е. физически не происходит отправка post запроса.
Но если я ставлю onClick='this.form.submit()', обновление html странички после нажатия кнопки, то страничка перерисовывается и стиль кнопки возвращается в исходную позицию, но post запрос отправляется.
Хочу что бы при перемещении кнопки, она оставалась в этом положении до следующего нажатия, и соответственно отправлялся post запрос.
Я бы прислушался к советам товарищей выше и копал в сторону ajax. Работу с формами выкинуть на помойку. Для отладки использовать консоль браузера, сниффер и терминал. Я бы в качестве протокола использовал json, так как он встроен в java script, а для мк можно использовать jsmn для парсинга. Ещё бы рекомендовал использовать отладчик, но всё это сложные материи, а вы хотите всё сразу.
Есть один, но нужна целая статья, чтобы описать как им пользоваться. Я помаленьку кропаю её и хочу выложить на хабре. Времени нету всё обстоятельно расписать. Если вкратце, то про отладку скетчей можно прочитать тут. Я сейчас примерно тем же занимаюсь, но у меня есть отладчик. Только я хочу использовать ajax и json, т.к. мне с ними удобнее.
Ардуинщикам трудно представить, что можно остановить выполнение программы, просмотреть всю карту регистров мк, поставить точки останова или пройтись пошагово по ассемблерному листингу. Это всё стандартные средства разработки, которые оказались за бортом из-за целей максимального упрощения работы с Arduino.
Что-то я не понимаю, как должна быть связана работа html кнопки и передача post запроса, т.к. у нас кнопка перемещается (визуально меняет состояние), только из-за того что работает css селектор, который визуально перемещает кнопку на заданную координату. Т.е. физически не происходит отправка post запроса.
Но если я ставлю onClick='this.form.submit()', обновление html странички после нажатия кнопки, то страничка перерисовывается и стиль кнопки возвращается в исходную позицию, но post запрос отправляется.
Хочу что бы при перемещении кнопки, она оставалась в этом положении до следующего нажатия, и соответственно отправлялся post запрос.
Есть объект checkbox у него два стиля checked и nonchecked. Стили просто отображают состояние объекта, они не вызывают отправку форм. Объекту на событие onclick навешивается обработчик, вот он и отправляет форму. Дуине отправляется post запрос с состояниями переключателей. Затем get запрос на обновление страницы и get запрос на получение script.js. Когда страничка загрузится выполнится скрипт, который установит переключатели в нужное состояние.
Если этого не происходит, значит где-то в этой последовательность есть ошибка.
Отправка данных case POST: setVars(); send(Ok); send(html); break;
В sirial monitor для случая с использованием onClick='this.form.submit()':
lighton=on
reqType=GETJS
1;
1;
Если убрать onClick='this.form.submit()', никакой отправки данных не происходит.
В живую можно пощелкать http://ackvarium.ddns.net/.
Режим работы - без onClick='this.form.submit()'.
Свет и т.д. - с onClick='this.form.submit()'.
Проблема в том, что мы нажали на кнопочку на форме, отправили в контроллер значение lighton=on, селектор css переключил визуально положение кнопки, но после перезагрузки страницы onClick='this.form.submit()', селектор css возвращается в исходную позицию.
ВОПРОС: как узнает селектор css, в каком положении должен быть переключатель?
После перезагрузки страницы также загружается script.js, вот он и должен устанавливть чекбоксы в нужное состояние, а CSS просто это отображает. Сейчас в скрипте у тебя:
так получается надо разкоментить это?
/*
//на стороне клиента должна получиться такая функция
function setVars()
{
document.getElementById('manauto').checked=1;
document.getElementById('light').checked=0;
document.getElementById('filter').checked=0;
document.getElementById('air').checked=0;
document.getElementById('hiteron').checked=0;
}
*/
Затем я нажимаю на перемещение кнопки, отправляется Post запрос и все, странича грузится бесконечно. Это из-за того, что мне нужно как-то указать, что nonchecked =avto.
отправляется Post запрос и все, странича грузится бесконечно.
Разница между GET и POST только в вызове функции setVars(); в ней застревает что ли?... если GET работает, а POST нет.
case GET: send(Ok); send(html); break;
case POST: setVars(); send(Ok); send(html); break;
В дуине добавлены переменные: avto, lightoff, filteroff, airoff, hiteroff.
А в html коде их нет. Похоже это те самые 5 фиктивных параметров, значит ты не понял мою идею. Я имел в виду, если форм больше одной и в них только чекбоксы то, что бы различить пустые запросы от разных форм нужно добавлять в формы фиктивные параметры. У нас только одна форма, значит пустой запрос означает все чекбоксы в состоянии nonchecked.
Еще одна мысль: анимация теряет смысл если страница обновляется сразу по клику.
Мы вернулись к тому, с чего начали пару дней назад. Меня не устраивает отправка состояния переключателей отдельной кнопкой. , на что мы договорились добавить фиктивные параметры, а это значит, что каждая кнопка - это отдельная форма. Т.о. html будет выглядеть:
Аналогично во все формы надо добавить hidden параметр со своим именем.
В дуине
void setVars()
{
String s=request.param();//получаю строку параметров из запроса
if (s.indexOf("lightfrm")!=-1) //если в запросе присутствует параметр lightfrm
{//значит запрос от формы Свет
if (s.indexOf("lighton")!=-1) lighton=true; //если есть lighton значит чекбокс checked
else lighton=false;//иначе nonchecked
}
...//аналогично для других запросов
}
Перемещение переключателей по прежнему ничего не меняет, sirial monitor молчит.
Судя по:
Andy пишет:
Дуине отправляется post запрос с состояниями переключателей. Затем get запрос на обновление страницы и get запрос на получение script.js. Когда страничка загрузится выполнится скрипт, который установит переключатели в нужное состояние.
После изменения состояния переключателя, необходимо отправить GET запрос на обновление страницы?
Но с другой стороны, у нас должен отправляться POST запрос, после изменения состояния переключателя, а это не происходит.
Значит у нас какая-то проблема с отправкой POST запроса здесь:
"Имена inputам лучше дать разные иначе запрос будет выглядеть так: manauto=on&manauto=." Такого не должно быть, т.к. manauto или =on или nonchecked. Или я опять что-то не понимаю?
Мы же хотим по клику отправлять форму, значит надо onClick='this.form.submit();'
Поскольку поля имеют одинаковые имена, получим такие запросы:
manauto=on&manauto=
или
manauto=
В первом случае состояние чекбокса передается т.к. он checked, во втором случае не передается, потому что nonchecked. В принципе эти запросы можно разобрать так:
void setVars()
{
String s=request.param();//получаю строку параметров из запроса
if (s.indexOf("manauto")!=-1) //если в запросе присутствует параметр manauto
{//значит запрос от формы manauto
if (s.indexOf("manauto=on")!=-1) manauto=true; //если есть "manauto=on" значит чекбокс checked
else manauto=false;//иначе nonchecked
}
...//аналогично для других запросов
}
Тогда с минимумом изменений.
Наступил на грабли. Checkbox передается в запросе только если он checked, иначе ничего не передается. Что бы понять, что за запрос приходится добавлять фиктивный параметр. 5 фиктивных параметров мне показалось слишком жирно. В итоге сделал одну форму, один post запрос. Вот что получилось:
html.h
request.h
Не грузится страничка, буду искать где проблема.
Строчка 233 "<tr><td><input type='hidden' name='tmp'><input type='submit' value='Отправить'></td></tr>" отправдяет выбранные выше положения переключателей? Если да, то как-то не очень красиво получается.
Не работает 81 строчка switch (request.type())
Как эту беду отладить?
Медленно, но верно приходит озарение, особенно к утру. Проблема в том, что в файле request.h в строке 11 мы присваиваем reqType=0; и возвращаем в 12 строке этот ноль в type. А для 0 у нас не указан switch.
0 отработается по default: break;
Но этого не должно быть, значит либо приходит запрос, которого мы не ожидали, либо мы не правильно разбираем нужный нам запрос. Вставь Serial.println(s); в функцию LookForKeyWord(). Посмотри, как выглядит запрос.
Не могу понять почему, но в request.h мы заходим только в 11 строку
и дальше останавливаемся.
Serial.begin(); не забыл раскомментировать в setup()?
Коммент #28 по-прежнему актуален.
Serial.begin(); не забыл раскомментировать в setup()?
Не забыл, без него монитор вообще не выводит ничего.
Коммент #28 по-прежнему актуален.
А вот после этого, страничка загрузилась. Но теряется весь вид, из-за наличия кнопки отправить.
После выбора необходимых комбинаций кнопок и нажатия кнопки отправить, строка браузера имеет такой вид 192.168.1.198/#, на сколько я понимаю там должно передваться состояние всех кнопок.
Все же предлагаю сделать отправку состояния каждой отдельной кнопки и избавиться от лишней кнопки "передать".
Теперь можно приступать к написанию исполнительной части?
Фиктивный параметр это String param(){return s;}? Для чего он нам нужен, если можно, чуть подробнее?
Да, это реализовано, но под atmega88 и без часов реального времени. Буду переделывать немного.
Фиктивный параметр в html коде строка 233 <input type='hidden' name='tmp'>, он передается в форме всегда, когда все чекбоксы в состоянии reset, в запросе передается только этот параметр.
Добавил, если я понял правильно, фиктивные параметры. Получил код следующего вида:
html:
Проблема в том, что в мониторе порта вижу отклик на действие кнопок manual=on, но в теле html не получается написать условие типа:
Выдает ошибку и просит поставить { перед if. Может быть это надо как-то по другому записать.
Т.е. при нажатии на кнопку режим работы, кнопка после обновления страницы, возвращается в исходное состояние. А мне нужно что бы после обновления страницы состояния других кнопок не менялось. А той, которая вызвала обновление - изменилось. Наверное как-то сумбурно получилось.
В нашей реализации состоянием переключателей управляет javascript, а он исполняется после полной загрузки html страницы. Поэтому при каждой перезагрузке страницы, мы будем видеть сначала исходное состояние переключателей, а затем после выполнения скрипта - их реальное состояние. Если не нравится эта перерисовка, тогда надо либо модифицировать html на лету, либо перенести форму в iFrame, либо использовать ajax запросы.
У меня другая проблема. Мне не очень нравится реализация передачи состояния всех кнопок, отдельной кнопкой. Мы по этому поводу говорили выше. Я ввел состояние кнопок manual/avto, filteron/filteroff, airon/airoff и т.д. Но для того, что бы передать состояние кнопки после изменения ее значения, я добавил перезагрузку страницы
И состояние кнопок перестало фиксироваться. Мне нужно как-то добавить условие, если manual==1 то переключить переключатель в состояние manual, если manual==0, то переключатель должен быть в режиме avto.
Давай по шагам. Положи html файл на локальный диск. Измени <form method="get", что бы видеть запросы прямо в адресной строке. Открой его в браузере. Нажимай на кнопки, форма должна отправляться при нажатии на любую кнопку, в зависимости от кнопки, в адресной строке должно появляться, что-то вроде этого:
file:///C:/HTML/filename.html?manauto=on
Страница обновляется, но состояние кнопок пока исходное. Верни <form method="post". Перенеси html в проект. Теперь браузером обращайся к дуине. Смотри, как она отрабатывает manauto=on, как генерит javascript, появляется ли в скрипте: document.getElementById('manauto').checked=1; как браузер исполняет этот скрипт, меняется ли состояние переключателя после исполнения скрипта.
Понял, проблема вот в чем:
"<td><input type='checkbox' id='manual' name='manual' onClick='this.form.submit()'/><label for='manual'>AUTO</label></td>"\
Я нажимаю на кнопку и получаю в serial monitor - manual=on, нажимаю еще раз и снова получаю то же самое. Нужно как-то в html написать условие, что если нажали на переключатель, то manual=on, а если еще раз нажали на переключатель, то avto=on. И что бы на экране положение кнопки менялось.
Нашел такое условие для html:
Но компилятор выдает ошибки, то на #, то просит какую-то {, хотя все есть. Наверное что-то в написании.
Что-то я не понимаю, как должна быть связана работа html кнопки и передача post запроса, т.к. у нас кнопка перемещается (визуально меняет состояние), только из-за того что работает css селектор, который визуально перемещает кнопку на заданную координату. Т.е. физически не происходит отправка post запроса.
Но если я ставлю onClick='this.form.submit()', обновление html странички после нажатия кнопки, то страничка перерисовывается и стиль кнопки возвращается в исходную позицию, но post запрос отправляется.
Хочу что бы при перемещении кнопки, она оставалась в этом положении до следующего нажатия, и соответственно отправлялся post запрос.
Я бы прислушался к советам товарищей выше и копал в сторону ajax. Работу с формами выкинуть на помойку. Для отладки использовать консоль браузера, сниффер и терминал. Я бы в качестве протокола использовал json, так как он встроен в java script, а для мк можно использовать jsmn для парсинга. Ещё бы рекомендовал использовать отладчик, но всё это сложные материи, а вы хотите всё сразу.
С этого момента по подробнее. Какой?
Есть один, но нужна целая статья, чтобы описать как им пользоваться. Я помаленьку кропаю её и хочу выложить на хабре. Времени нету всё обстоятельно расписать. Если вкратце, то про отладку скетчей можно прочитать тут. Я сейчас примерно тем же занимаюсь, но у меня есть отладчик. Только я хочу использовать ajax и json, т.к. мне с ними удобнее.
Отладка идет путем вывода данных в sirial monitor?
Ардуинщикам трудно представить, что можно остановить выполнение программы, просмотреть всю карту регистров мк, поставить точки останова или пройтись пошагово по ассемблерному листингу. Это всё стандартные средства разработки, которые оказались за бортом из-за целей максимального упрощения работы с Arduino.
Но если я ставлю onClick='this.form.submit()', обновление html странички после нажатия кнопки, то страничка перерисовывается и стиль кнопки возвращается в исходную позицию, но post запрос отправляется.
Хочу что бы при перемещении кнопки, она оставалась в этом положении до следующего нажатия, и соответственно отправлялся post запрос.
Есть объект checkbox у него два стиля checked и nonchecked. Стили просто отображают состояние объекта, они не вызывают отправку форм. Объекту на событие onclick навешивается обработчик, вот он и отправляет форму. Дуине отправляется post запрос с состояниями переключателей. Затем get запрос на обновление страницы и get запрос на получение script.js. Когда страничка загрузится выполнится скрипт, который установит переключатели в нужное состояние.
Если этого не происходит, значит где-то в этой последовательность есть ошибка.
1. Т.е. onClick='this.form.submit()', это лишнее?
2 checkbox у него два стиля checked и nonchecked, можете ткнуть в какой строчке checkbox - стиль checked, а в какой nonchecked.
Это и есть обработчик события onClick, именно он отправляет форму.
:checked задает различия между стилями.
За визуальное перемещение переключателя на странице браузера, отвечает селектор css:
"[for='lighton']:before {"\
" content: 'OFF';"\
" position: absolute;"\
" right: 15px;"\
" color: #FF0000;"\
"}"\
"[for='lighton']:after {"\
" content: '';"\
" position: absolute;"\
" left: 5px; top: 5px;"\
" display: block;"\
" width: 55px;"\
" height: 30px;"\
" border-radius: 50px;"\
" background: #ccc linear-gradient(#fcfff4 0%, #dfe5d7 40%, #b3bead 100%);"\
" transition: .5s;"\
"}"\
"#lighton:checked ~ [for='lighton']:after {"\
" left: 65px;"\
"}"\
Отправка данных case POST: setVars(); send(Ok); send(html); break;
В sirial monitor для случая с использованием onClick='this.form.submit()':
lighton=on
reqType=GETJS
1;
1;
Если убрать onClick='this.form.submit()', никакой отправки данных не происходит.
В живую можно пощелкать http://ackvarium.ddns.net/.
Режим работы - без onClick='this.form.submit()'.
Свет и т.д. - с onClick='this.form.submit()'.
Проблема в том, что мы нажали на кнопочку на форме, отправили в контроллер значение lighton=on, селектор css переключил визуально положение кнопки, но после перезагрузки страницы onClick='this.form.submit()', селектор css возвращается в исходную позицию.
ВОПРОС: как узнает селектор css, в каком положении должен быть переключатель?
После перезагрузки страницы также загружается script.js, вот он и должен устанавливть чекбоксы в нужное состояние, а CSS просто это отображает. Сейчас в скрипте у тебя:
А должно быть:
так получается надо разкоментить это?
/*
//на стороне клиента должна получиться такая функция
function setVars()
{
document.getElementById('manauto').checked=1;
document.getElementById('light').checked=0;
document.getElementById('filter').checked=0;
document.getElementById('air').checked=0;
document.getElementById('hiteron').checked=0;
}
*/
В дуине такой код:
В результате его работы браузер клиента должен получить такой скрипт:
но получаем ошибку: function и document. Добавьте пожалуста не много больше букв.
script.js передаст в html, что checkbox - checked или nonchecked?
Как посмотреть, получит ли браузер этот скрипт?
функция document.getElementById('manauto').checked=1; найдет в теле html тег с id='manauto', это в нашем случае:
<input type="checkbox" id="manauto" name="manauto" onClick='this.form.submit();'/>
и установит его в checked. А CSS это отобразит. Аналогично поступят остальные функции скрипта со своими тегами.
в исходном коде:
<script type='text/javascript' src='script.js'></script>
</head>
<body onload='setVars();'><form method='post' action='#'>
<table align=left border=0 cellpadding=5 cellspacing=1 width='auto'><tbody>
<tr><
td>Режим работы</td>
<td><input type='checkbox' id='manual' name='avto' onClick='this.form.submit()'/><label for='manual'>AUTO</label></td>
<td>Feedback</td>
</tr><tr>
<td>Свет</td>
<td><input type='checkbox' id='lighton' name='lighton' onClick='this.form.submit()'/><label for='lighton'>ON</label></td>
<td>Feedback</td></tr>
<tr><td>Фильтр</td><td><input type='checkbox' id='filteron' name='filteron' onClick='this.form.submit()'/><label for='filteron'>ON</label></td>
<td>Feedback</td></tr>
<tr><td>Компрессор</td>
<td><input type='checkbox' id='airon' name='airon' onClick='this.form.submit()'/><label for='airon'>ON</label></td>
<td>Feedback</td></tr>
<tr><td>Нагреватель</td>
<td><input type='checkbox' id='hiteron' name='hiteron' onClick='this.form.submit()'/><label for='hiteron'>ON</label></td><td>Feedback</td></tr>
</tbody></table></form></body></html>
Исходный код выглядит так:
<script type='text/javascript' src='script.js'></script>
script.js можно кликнуть и увидеть его содержимое, разве нет?
Исходный код выглядит так:
<script type='text/javascript' src='script.js'></script>
script.js можно кликнуть и увидеть его содержимое, разве нет?
В исходном коде в опере так не получится, т.к. он в текстовом формате. Это нужно opera dragonfly, попробую запустить.
можно в адресной строке набрать http://ackvarium.ddns.net/script.js
Спасибо, получилось function setVars(){ 1; 1; 1; 0; 1; 0; 1; 0; 1; 0; }
Вот это не работает:
Получаем:
1;
1;
Пробовал так:
получалось:
Пробовал так:
получилось:
Переключатель - переключается. Но назад визуально возвращается, а запроса не приходит.
М.б. какой-нибудь селектор поможет выйти из ситуации, типа
Вот это не работает:
1
s=
"document.getElementById('manual').checked="
+manual?
"1;"
:
"0;"
;
а если так:
s=
"document.getElementById('manual').checked="; if(
manual) s+=
"1;"; else s+=
"0;"
;
в крайнем случае так:
client.print("document.getElementById('manual').checked="); if(
manual)
client.println(
"1;") else
client.println(
"0;");
Первый вариант заработал
Затем я нажимаю на перемещение кнопки, отправляется Post запрос и все, странича грузится бесконечно. Это из-за того, что мне нужно как-то указать, что nonchecked =avto.
В дуине добавлены переменные:
avto,
lightoff,
filteroff,
airoff,
hiteroff.
А в html коде их нет. Похоже это те самые 5 фиктивных параметров, значит ты не понял мою идею. Я имел в виду, если форм больше одной и в них только чекбоксы то, что бы различить пустые запросы от разных форм нужно добавлять в формы фиктивные параметры. У нас только одна форма, значит пустой запрос означает все чекбоксы в состоянии nonchecked.
Еще одна мысль: анимация теряет смысл если страница обновляется сразу по клику.
Мы вернулись к тому, с чего начали пару дней назад. Меня не устраивает отправка состояния переключателей отдельной кнопкой. , на что мы договорились добавить фиктивные параметры, а это значит, что каждая кнопка - это отдельная форма. Т.о. html будет выглядеть:
1) Где необходимо установить фиктивный параметр?
2) Согласен с вашей мудрой мыслью, но не понимаю как должна обовляться страница.
В html
Аналогично во все формы надо добавить hidden параметр со своим именем.
В дуине
После загрузки в первый раз страницы, получаю:
Перемещение переключателей по прежнему ничего не меняет, sirial monitor молчит.
Судя по:
Дуине отправляется post запрос с состояниями переключателей. Затем get запрос на обновление страницы и get запрос на получение script.js. Когда страничка загрузится выполнится скрипт, который установит переключатели в нужное состояние.
После изменения состояния переключателя, необходимо отправить GET запрос на обновление страницы?
Но с другой стороны, у нас должен отправляться POST запрос, после изменения состояния переключателя, а это не происходит.
Значит у нас какая-то проблема с отправкой POST запроса здесь:
В обработчик запихать отправку POST запроса?
"Имена inputам лучше дать разные иначе запрос будет выглядеть так: manauto=on&manauto=." Такого не должно быть, т.к. manauto или =on или nonchecked. Или я опять что-то не понимаю?
Мы же хотим по клику отправлять форму, значит надо onClick='this.form.submit();'
Поскольку поля имеют одинаковые имена, получим такие запросы:
manauto=on&manauto=
или
manauto=
В первом случае состояние чекбокса передается т.к. он checked, во втором случае не передается, потому что nonchecked. В принципе эти запросы можно разобрать так: