简体   繁体   中英

Javascript display div only once

So I have a calculator with an error message that displays, if they press the "calculate" button if the input is NaN. The error message keeps getting created everytime the user presses calculate. How do i make it so it only shows even after pressing "calculate" multiple times?

在此处输入图片说明

    function displayErr() {
    const formBox = document.querySelector("form");
    const errorBox = document.createElement("div");
    errorBox.className = "errorBox";
    const errorText = document.createTextNode("Those are not numbers!");
    errorBox.appendChild(errorText);
    formBox.appendChild(errorBox);
}

if ((isNaN(billInput)) || (isNaN(peopleAmount)) || (billInput === "") || (peopleAmount === "")) {
    displayErr();
}

The most straightforward way is to check if the element already exists.

function displayErr() {
    // Get error element
    const errorElement = document.getElementsByClassName('errorBox');

    // If it already exists
    if (errorElement && errorElement.length > 0) {

        // Dont add another one
        return;
    }

    // Add new errorBox
    const formBox = document.querySelector("form");
    const errorBox = document.createElement("div");
    errorBox.className = "errorBox";
    const errorText = document.createTextNode("Those are not numbers!");
    errorBox.appendChild(errorText);
    formBox.appendChild(errorBox);
}

Another option would to be using css classes to 'hide' the element;

  1. Always render the element, but hide it with display: none
  2. In the displayErr() , make the element visible with something like document.getElementsByClassName('errorBox')[0].style.display = block;

a better way of doing this is to show and hide the element using CSS classes create the element and hide it using

display: none;

and show it by adding a class to the element

display: block;

 const element = document.getElementById("myDIV"); const button = document.getElementById("btn"); button.addEventListener("click", () => element.classList.toggle("show"));
 #myDIV { display: none; } .show { display: block !important; }
 <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <button id="btn">Try it</button> <div id="myDIV"> This is a DIV element. </div> </body> </html>

For what it's worth, here is a pure JavaScript example of a show/hide interpretation:

function CheckInput() {
    const billInput = document.getElementById("b").value;
    const peopleAmount = document.getElementById("p").value;

    if ((isNaN(billInput)) || (isNaN(peopleAmount)) || (billInput === "") || (peopleAmount === "")) {
    showErr();
  }
  else{
    hideErr();
  }
}

function hideErr(){
    console.log("hide");
    const el = document.getElementById("error");
    el.style.display = "none";
}
function showErr(){
    console.log("show");
    const el = document.getElementById("error");
    el.style.display = "block";
    el.innerHTML = "Hey sorry wrong input";
}

window.onload = function() {
    hideErr();
}

You can see the HTML and try the code here: https://jsfiddle.net/0mrx5ev7/

You can pass a parameter to your displayErr function, then use it to set the hidden HTML attribute and textContent of a single target div, identified by its HTML id .

This way, the functionality becomes reusable, and you can set/unset the error message whenever you need.

 const input = document.querySelector('#input') const errDisplay = document.querySelector('#err-display') function displayErr(msg) { errDisplay.textContent = msg || '' errDisplay.hidden = msg ? null : 'hidden' } input.addEventListener('input', () => { displayErr(isNaN(input.value) ? "Not a number" : null) })
 #err-display { font-family: sans-serif; background: red; color: white; margin: .5em 0; padding: .5em; }
 <input id='input' placeholder='Start typing'> <div id='err-display' hidden></div>

try to use a counter. like if int i == 0 --> do the function. i would do so

    int i = 0;

    function displayErr() {
    const formBox = document.querySelector("form");
    const errorBox = document.createElement("div");
    errorBox.className = "errorBox";
    const errorText = document.createTextNode("Those are not numbers!");
    errorBox.appendChild(errorText);
    formBox.appendChild(errorBox);
}

   if ((isNaN(billInput)) && i == 0 || (isNaN(peopleAmount)) && i == 0 || 
      (billInput === "") && i == 0 || (peopleAmount === "") && i == 0) 
{
    displayErr();
    i += 1;
}

now it will display an error only once, because i is never going to be 0 anymore

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM