• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

"Pushbutton" w przeglądarce

Object Storage Arubacloud
0 głosów
247 wizyt
pytanie zadane 10 grudnia 2021 w HTML i CSS przez Smartfoniak Nowicjusz (120 p.)
edycja 10 grudnia 2021 przez Smartfoniak

Witam, bawię się trochę w html'u i chciałem wykonać (przy pomocy wujka Google, użyłem gotowego kodu i troche zmodyfikowałem) lokalną stronę internetową, na której były by przyciski, które przekazywały by informację o wciśnięciu do ESP32, no i do tego momentu mi się udało. Bardzo mi zależy na tym, aby to były przyciski (pushbutton), a nie przełączniki. Bardzo bym prosił o pomoc, nigdzie nie mogę znaleźć sposobu, aby on tak działał (może też nie do końca rozumiem te rozwiązania). Z góry dziękuję za pomoc.

Obecny kod strony:

<!DOCTYPE HTML><html>
<head>
  <title>Obsluga zdalna</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="data:,">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 3.0rem;}
    p {font-size: 3.0rem;}
    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
    .button {position: relative; display: inline-block; width: 120px; height: 68px} 
    .button input {display: none}
    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 6px}
    .slider:before {position: absolute; content: ""; height: 52px; width: 104px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 3px;background-color: #b80}
    input:checked+.slider {}
    input:checked+.slider:before {background-color: #d20}
  </style>
</head>
<body>
  <h2>Obsluga zdalna</h2>
  <h4>Power</h4><label class="button"><input type="checkbox" onchange="toggleCheckbox(this)" id="2" ><span class="slider"></span></label><h4>Volume up</h4><label class="button"><input type="checkbox" onchange="toggleCheckbox(this)" id="4" ><span class="slider"></span></label><h4>Volume down</h4><label class="button"><input type="checkbox" onchange="toggleCheckbox(this)" id="33" ><span class="slider"></span></label>
<script>function toggleCheckbox(element) {
  var xhr = new XMLHttpRequest();
  if(element.checked){ xhr.open("GET", "/update?output="+element.id+"&state=1", true); 
  }
  else { xhr.open("GET", "/update?output="+element.id+"&state=0", true); }
  xhr.send();
}
</script>
</body>
</html>

 

Kod ESP(nie zaktualizowany, ponieważ sama strona jeszcze nie działa)

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

const char* ssid = "HUAWEI_B535_D6C4DD";
const char* password = "haslo";

const char* Pin = "output";
const char* Status = "state";

AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <title>Obsluga zdalna</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="data:,">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 3.0rem;}
    p {font-size: 3.0rem;}
    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
    .button {position: relative; display: inline-block; width: 120px; height: 68px} 
    .button input {display: none}
    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 6px}
    .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 3px}
    input:checked+.slider {background-color: #b30000}
    input:checked+.slider:before 
  </style>
</head>
<body>
  <h2>Obsluga zdalna</h2>
  %BUTTONPLACEHOLDER%
<script>function toggleCheckbox(element) {
  var xhr = new XMLHttpRequest();
  if(element.checked){ xhr.open("GET", "/update?output="+element.id+"&state=1", true); }
  else { xhr.open("GET", "/update?output="+element.id+"&state=0", true); }
  xhr.send();
}
</script>
</body>
</html>
)rawliteral";

// Replaces placeholder with button section in your web page
String processor(const String& var){
  //Serial.println(var);
  if(var == "BUTTONPLACEHOLDER"){
    String buttons = "";
    buttons += "<h4>Power</h4><label class=\"button\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"2\" " + outputState(2) + "><span class=\"slider\"></span></label>";
    buttons += "<h4>Volume up</h4><label class=\"button\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"4\" " + outputState(4) + "><span class=\"slider\"></span></label>";
    buttons += "<h4>Volume down</h4><label class=\"button\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"33\" " + outputState(33) + "><span class=\"slider\"></span></label>";
    return buttons;
  }
  return String();
}

String outputState(int output){
  if(digitalRead(output)){
    return "checked";
  }
  else {
    return "";
  }
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
  pinMode(33, OUTPUT);
  digitalWrite(33, LOW);
  
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  // Send a GET request to <ESP_IP>/update?output=<Czynnosc>&state=<Stan>
  server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String Czynnosc;
    String Stan;
    // GET input1 value on <ESP_IP>/update?output=<Czynnosc>&state=<Stan>
    if (request->hasParam(Pin) && request->hasParam(Status)) {
      Czynnosc = request->getParam(Pin)->value();
      Stan = request->getParam(Status)->value();
      digitalWrite(Czynnosc.toInt(), Stan.toInt());
    }
    else {
      Czynnosc = "No message sent";
      Stan = "No message sent";
    }
    Serial.print("GPIO: ");
    Serial.print(Czynnosc);
    Serial.print(" - Set to: ");
    Serial.println(Stan);
    request->send(200, "text/plain", "OK");
  });

  // Start server
  server.begin();
}

void loop() {

}

 

komentarz 10 grudnia 2021 przez adrian17 Ekspert (344,860 p.)

Niezbyt rozumiem...

Bardzo mi zależy na tym, aby to były przyciski (pushbutton), a nie przełączniki

Ale w kodzie masz checkboxy? Czemu nie zwykły `<button>`?

komentarz 10 grudnia 2021 przez Smartfoniak Nowicjusz (120 p.)
Gdzieś czytałem, że się tego "<button>" (już?) nie używa. Ale może spróbuję.
komentarz 10 grudnia 2021 przez Wiciorny Ekspert (270,110 p.)
a co to jest pushbutton ?
komentarz 10 grudnia 2021 przez Smartfoniak Nowicjusz (120 p.)
przycisk jednopozycyjny
1
komentarz 10 grudnia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Gdzieś czytałem, że się tego "<button>" (już?) nie używa.

Gdzie to przeczytałeś? Może to odnosiło się do historycznych powodów związanych ze stylowaniem?

komentarz 10 grudnia 2021 przez Wiciorny Ekspert (270,110 p.)
podejrzewam, że wyczytał na stronie jakiegoś "janusza' po bootcampie, tutorialach z byleczego że np. buttona się niestosuje tylko submit, ale może to być prawda np. w sytuacji "FORMA" formularzy w sensie, lepiej wtedy submit stosować, ale konwencja i tak zależy od architektury
komentarz 10 grudnia 2021 przez Smartfoniak Nowicjusz (120 p.)

Zgadza się, właśnie pisali, że buttona się nie stosuje tylko submit. Udało mi się wstępnie osiągnąć wygląd strony przy użyciu tej funkcji, jednak nie mogę "wyciągnąć" zmiany stanu przycisku, może macie jakieś rady?

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#define RELAY_NO    true
#define NUM_RELAYS  1

int relayGPIOs[NUM_RELAYS] = {5};

const char* ssid = "HUAWEI_B535_D6C4DD";
const char* password = "haslo;

const char* PARAM_INPUT_1 = "output";
const char* PARAM_INPUT_2 = "state";

AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
  <head>
    <title>Panel Zdalny</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <style>
      .button{
      width: 100px;
      height: 60px;
      background-color: #666666;
      border: none;
      cursor: pointer;
      display: inline-block;
      transition-duration: 0.4s;
      margin-left: auto;
      margin-right: auto;
      text-align: center;
      }
      
      .button:hover{background-color: #444444;}
      
      h1 {text-align: center; padding: 20px;}
      
      .container{
      width: 500px;
      background-color: #00d900;
      margin-left: auto;
      margin-right: auto;
      }
      
      .buttonlist{
      width: 100px;
      margin-left: auto;
      margin-right: auto;
      
      }
    </style>
  </head>
  <body>
    <div class="container">
      <h1>Panel Zdalny</h1>
      <div class="buttonlist">
        <button class="button" type="button" onclick=
        "/update?output=5&state=1">POWER</button>
        </br></br>
      </div>
    </div>
  
  </body>
</html>
)rawliteral";

void setup(){
  Serial.begin(115200);
    pinMode(5, OUTPUT);
    digitalWrite(5, LOW);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(1000);
      Serial.println("Łączenie z&nbsp;WiFi..");
    }
  Serial.println(WiFi.localIP());
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html);
  });

  server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    String inputParam;
    String inputMessage2;
    String inputParam2;
    //GET input1 value on <ESP_IP>/update?relay=<inputMessage>
    if (request->hasParam(PARAM_INPUT_1) & request->hasParam(PARAM_INPUT_2)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      inputParam = PARAM_INPUT_1;
      inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
      inputParam2 = PARAM_INPUT_2;
      if(RELAY_NO){
        Serial.print("NO ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], !inputMessage2.toInt());
      }
      else{
        Serial.print("NC ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], inputMessage2.toInt());
      }
    }
    else {
      inputMessage = "No message sent";
      inputParam = "none";
    }
    Serial.println(inputMessage + inputMessage2);
    request->send(200, "text/plain", "OK");
  });
  // Start server
  server.begin();
}

void loop() {

}

 

komentarz 10 grudnia 2021 przez Wiciorny Ekspert (270,110 p.)
z tym submitem to polemizowałbym, z tym że to się tyczy FORMULARZY i tutaj lepiej wydaje mi się korzystać z typowo "submit" natomiast buttony to co innego w zakresie strony, czy stosowania ich jako nawigacji, wyboru ... jakiś wartości, akceptacji czegoś co też nie służy jako formularz przesyłania
1
komentarz 10 grudnia 2021 przez ScriptyChris Mędrzec (190,190 p.)

Tyle, że <button> należy do elementów, które mogą być użyte w formularzu, ma atrybuty związane z wysyłaniem formularza i domyślnym typem przycisku skojarzonego z formularzem jest "submit". Nie rozumiem więc, dlaczego miało by się nie używać przycisku do submitowania formularza. Może chodzi o dodatkowy narzut w postaci odpowiedniego ustawiania mu atrybutu type, żeby zapobiec sytuacji, gdy przycisk, który nie ma służyć do wysłania formularza, nie został na taki wybrany domyślnie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 54 wizyt
+1 głos
1 odpowiedź 222 wizyt
pytanie zadane 24 października 2022 w Matematyka, fizyka, logika przez manjaro Nałogowiec (37,390 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...