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

Pin w JavaScript

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+1 głos
314 wizyt
pytanie zadane 25 marca 2022 w JavaScript przez Maciek273 Początkujący (450 p.)

Witam. Mam problem z programem w JavaScript. Otóż po kliknięciu przycisku OK, niezależnie od wpisanego kodu zawsze wyświetla mi się zielony napis "Witaj w pracy". Nie mam pojęcia co zrobić, aby w przypadku wpisania złego kodu wyświetlał się czerwony komunikat o nieznajomości kodu PIN. Czy coś w tym kodzie źle przypisałem?

Tutaj treść zadania: 

•      Wciśnięcie przycisku „OK” powinno wyzwolić sprawdzenie numeru PIN:

◦    jeśli przekroczono dozwoloną ilość prób to powinien się wyświetlić akapit klasy „error” w sekcji klasy „msg”,

◦    jeśli wpisany numer pin jest poprawny (poprawny pin zapisano w atrybucie „data-pin” elementu „body”) to należy wyświetlić akapit klasy „success” w sekcji klasy „msg”,

A tutaj kod HTML, CSS i JavaScript:

<!DOCTYPE html>
<html>
  <head>
    <title>PS5 - Zadanie 1</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="zad1.css">
  </head>

  <body data-pin="4790">
    
    <section class="msg">
      <h2>Witaj w systemie firmowym!</h2>
      <p class="error">Niestety nie znasz numeru PIN!</p>
      <p class="success">Witaj w pracy!</p>
      <p class="info">Podaj PIN! Pozostała ilość prób: <span id="attempts" data-max="3">3</span></p>
    </section>
    
    <section class="secure">
      <h2 id="pin-display"></h2>
      <div class="keyboard">
        <div>
          <button value="1">1</button>
          <button value="2">2</button>
          <button value="3">3</button>
        </div>
        <div>
          <button value="4">4</button>
          <button value="5">5</button>
          <button value="6">6</button>
        </div>
        <div>
          <button value="7">7</button>
          <button value="8">8</button>
          <button value="9">9</button>
        </div>      
        <div>
          <button value="reset">Reset</button>
          <button value="0">0</button>
          <button value="ok">OK</button>
        </div>
      </div>
      <p>Bardzo Bezpieczna Firma S.A.</p>
    </section>
    
  <script src="zad1.js"></script>  
  </body>
</html>
* {
  box-sizing: border-box;
}

section {
  margin: 0;
  padding: 20px;
}

section.msg {
  position: absolute;
  top: 2%;
  left: 0;
  height: 20%;
  width: 100%;
}

section.msg h2, section.msg p {
  text-align: center;
}

section.msg p {
  font-weight: bold;
}

section.msg p.error {
  color: red;
  display: none;
}

section.msg p.success {
  color: green;
  display: none;
}

section.secure {
  position: absolute;
  top: 25%;
  left: 30%;
  width: 40%;
  height: 60%;
  border: 1px solid black;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  background-color: rgb(100,192,100);
  padding-bottom: 5px;
}

section.secure h2 {
  font-size: 30px;
  font-family: monospace;
  background-color: black;
  width: 100%;
  height: 40px;
  margin: 0;
  color: white;
  font-weight: bold;
  text-align: right;
  padding: 2px;
  border: 3px solid rgb(0,100,0);
}

section.secure p {
  text-align: right;
  font-style: italic;
}

div.keyboard {
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  flex: 6;
}

div.keyboard > div {
  display: flex;
  justify-content: space-around;
}

div.keyboard > div > button {
  width: 25%;
  height: 3em;
  box-shadow: 3px 3px 5px rgba(0,0,0,0.5);
}

div.keyboard > div > button:active {
  box-shadow: none;
}
let przyciski = document.querySelectorAll('button');
let pin = document.querySelector('body').dataset.pin;
let obiekt = document.getElementById('pin-display');
let msgError = document.querySelector('section.msg p.error');
let msgSuccess = document.querySelector('section.msg p.success');


for(przycisk of przyciski){
	przycisk.addEventListener('click', function(event){
		kliknietoPrzycisk(event.target.value);
	});
}

function kliknietoPrzycisk(numer){
	if(numer == "reset"){
		obiekt.textContent = null;
	}
	else if(numer == "ok"){
		if(pin == "4790"){
			msgSuccess.style.display = 'block';
		}
		else{
			msgError.style.display = 'block';
		}
		obiekt.textContent = null;
	}
	else{
		obiekt.textContent = obiekt.textContent + numer;
	}
}

 

1 odpowiedź

+1 głos
odpowiedź 25 marca 2022 przez rafal.budzis Szeryf (85,380 p.)
wybrane 25 marca 2022 przez Maciek273
 
Najlepsza

Na samym początku pobierasz wartość z tego elementu 

<body data-pin="4790">

Robisz to w tej linijce 

let pin = document.querySelector('body').dataset.pin;

Potem spraawdzasz czy pobraana warość z body jest równa 

        if(pin == "4790"){
            msgSuccess.style.display = 'block';
        }

wieć zawsze bedzie true bo nie aktualizujesz wartości zmiennej pin względem tego co wpisuje user ;) 

Zamiast if(pin == "4790"){ daj if(obiekt.textContent == "4790"){

1
komentarz 25 marca 2022 przez VBService Ekspert (256,320 p.)

Zamiast if(pin == "4790"){ daj if(obiekt.textContent == "4790")

albo  wink

if (obiekt.textContent == pin)

skoro

let pin = document.querySelector('body').dataset.pin;

 

bo nie aktualizujesz wartości zmiennej pin względem tego co wpisuje user ;)

raczej powinno być: porównujesz.

komentarz 25 marca 2022 przez Maciek273 Początkujący (450 p.)
Dzięki, rozumiem już o co chodzi :)
komentarz 25 marca 2022 przez VBService Ekspert (256,320 p.)

BTW, zamieniłbym to  wink

else{
        obiekt.textContent = obiekt.textContent + numer;
}

na np.

    else{
      if (obiekt.textContent.length < 10)
        obiekt.textContent += numer;
    }

 

komentarz 25 marca 2022 przez VBService Ekspert (256,320 p.)

BTW, spróbuj zapoznać się z Event Delegation

przykład

window.onload = load; // window.addEventListener('load', load);

function load() {
  const pin = document.querySelector('body').dataset.pin,
        pinPanel = document.querySelector('section.secure'),
        pinDisplay = document.getElementById('pin-display'),
        msgError = document.querySelector('section.msg p.error'),
        msgSuccess = document.querySelector('section.msg p.success');

  pinPanel.onclick = pinPanelAction; // pinPanel.addEventListener('click', pinPanelAction);

  function pinPanelAction(e) {
    if (e.target.nodeName == 'BUTTON') {
      switch (e.target.value) {
        case 'reset': 
          pinDisplay.textContent = null; 
          break;
        case 'ok':
          if (pinDisplay.textContent == pin)
            msgSuccess.style.display = 'block';
          else {
            msgError.style.display = 'block';
            setTimeout(function() { msgError.style.display = 'none'; }, 2000);
          }

          pinDisplay.textContent = null;          
          break;
        default:
          if (pinDisplay.textContent.length < 10)
            pinDisplay.textContent += e.target.value;
      }
    } 
  }
}

 

komentarz 25 marca 2022 przez VBService Ekspert (256,320 p.)
edycja 25 marca 2022 przez VBService

BTW, a co powiesz na to wink

dodaj do <head>

<link href='https://fonts.googleapis.com/css?family=Orbitron&text=0123456789' rel='stylesheet' type='text/css'>

np.

  <head>
    <title>PS5 - Zadanie 1</title>
    <meta charset="utf-8">
    <link href='https://fonts.googleapis.com/css?family=Orbitron&text=0123456789' rel='stylesheet' type='text/css'>
    <link rel="stylesheet" href="zad1.css">
  </head>

i w css-ie

section.secure h2 {
  font-size: 1.1em/1.1;
  font-family: 'Orbitron', sans-serif;
  font-weight: bold;
  ...
}

żeby nie pobierać "całej czcionki" możemy wskazać, które znaki będą "potrzebne"  wink

https://fonts.googleapis.com/css?family=Orbitron&text=0123456789

Podobne pytania

0 głosów
3 odpowiedzi 560 wizyt
0 głosów
2 odpowiedzi 557 wizyt
0 głosów
0 odpowiedzi 363 wizyt

93,158 zapytań

142,171 odpowiedzi

321,881 komentarzy

62,487 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 224p. - Marcin Putra
  2. 224p. - nidomika
  3. 223p. - dia-Chann
  4. 221p. - ssynowiec
  5. 217p. - Mikbac
  6. 216p. - CC PL
  7. 215p. - Łukasz Piwowar
  8. 212p. - zmmz89
  9. 210p. - Adrian Wieprzkowicz
  10. 208p. - rafalszastok
  11. 206p. - Michal Drewniak
  12. 204p. - Łukasz Eckert
  13. 202p. - rucin93
  14. 200p. - robwarsz
  15. 198p. - TheLukaszNs
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...