Проверьте существование var и обновите его - PullRequest
0 голосов
/ 27 марта 2020

У меня есть дозатор кофе, я хотел бы, чтобы в переменную "totcaps" уже были добавлены капсулы, а затем добавить еще.

В двух словах: sh что если никогда ранее капсулы не добавлялись, то добавьте их, в противном случае добавьте их к существующим.

<!DOCTYPE html>
<html lang="it">

<head>
  <script>
    /* Mess info/err */
    function writeMess(node, mess) {

      newmess = document.createTextNode(mess);
      node.replaceChild(newmess, node.firstChild);
    }


    /* Add caps */
    function Add() {
      try {
        /* Default no message */
        writeMess(nodoMess, "");

        capsule = Number(nodoCapsule.value);
        /* Empty field */
        if (nodoCapsule.value == "" || capsule == 0) {
          writeMess(nodoMess, "Insert number of caps");
          return;
        } else
          /* isNaN */
          if (isNaN(capsule)) {
            writeMess(nodoMess, "Insert valid");
            return;
          }
        else /* Create and update if already exists */
          if (totcaps === "") {
            totcaps = Number(nodoCapsule.value);
            writeMess(nodoMess, "You insert: " + nodoCapsule.value + " caps");
          }
        else {
          totcaps = Number(totcaps) + Number(nodoCapsule.value);
          writeMess(nodoMess, "You insert: " + totcaps + " caps");
        }
      } catch (e) {
        alert("Add " + e);
      }
    }


    /* Globals */
    var nodoAdd;
    var nodoCapsule;
    var totcaps;



    /* Core function */
    function gestoreLoad() {
      try {
        /* Visits */
        nodoAdd = document.getElementById("add");
        nodoCapsule = document.getElementById("caps");
        nodoMess = document.getElementById("messinfoerr");


        /* Events */
        nodoAdd.onclick = Add;

        /* Empty text nodes */
        nodoCapsule.value = "";

        /* Empty message */
        var TextNode = document.createTextNode("");
        nodoMess.appendChild(TextNode);

      } catch (e) {
        alert("gestoreLoad " + e);

      }
    }


    /* Load the code */
    window.onload = gestoreLoad;
  </script>
</head>

<body>
  <h1>Dispenser</h1>
  <p id="messinfoerr"></p>
  <br />
  <input type="text" id="caps" />
  <input type="button" id="add" value="Add x caps" />
  <br />

  <br />

</body>

</html>

Я получаю «Ошибка ссылки: общие значения не определены», как решить?

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Вы бы выиграли от использования else if, чтобы ваши логики c стали более компактными. Ваша неопределенная ошибка исходит от того, что вы используете переменную до ее создания. Я предполагаю, что вы хотели использовать totcaps вместо этого. Я также упростил некоторые другие повторяющиеся вещи, которые вы делали.

Причина! Totcaps не работает так, как вы хотите (как описано в ответе Салмина), потому что отметка ! проверяет "", null, undefined, false и цифры 0 и NaN. Поскольку вы хотите проверить только на NaN, сделайте это, но пропустите тройной ===, чтобы избежать явной проверки типа.

/* Globals */
var nodoAdd;
var nodoCapsule;
var totcaps;

/* Mess info/err */
function writeMess(node, mess) {
    newmess = document.createTextNode(mess);
    node.replaceChild(newmess, node.firstChild);
}

/* Add caps */
function Add() {
    try {
        /* Default no message */
        writeMess(nodoMess, "");
        let capsule = Number(nodoCapsule.value);
        let sign = capsule < 0 ? '' : '+';
        
        /* Empty field */
        if (capsule == "" || capsule == 0) {
            writeMess(nodoMess, "Insert number of caps");
        } else if (isNaN(capsule)) {
        /* isNaN */
            writeMess(nodoMess, "Insert valid");
        } else if (totcaps == null) {
        /* Create */
            totcaps = capsule;
            writeMess(nodoMess, "You insert: " + capsule + " caps");
        } else {
        /* Update if already exists */
            totcaps += capsule;
            writeMess(nodoMess, "You insert: " + totcaps + " caps. (" + sign + capsule + ")");
        }
    } catch (e) {
        alert("Add " + e);
    }
}

/* Core function */
function gestoreLoad() {
    try {
        /* Visits */
        nodoAdd = document.getElementById("add");
        nodoCapsule = document.getElementById("caps");
        nodoMess = document.getElementById("messinfoerr");


        /* Events */
        nodoAdd.onclick = Add;

        /* Empty text nodes */
        nodoCapsule.value = "";

        /* Empty message */
        var TextNode = document.createTextNode("");
        nodoMess.appendChild(TextNode);

    } catch (e) {
        alert("gestoreLoad " + e);

    }
}


/* Load the code */
window.onload = gestoreLoad;
<!DOCTYPE html>
<html lang="it">
<head>

</head>
<body>
	<h1>Dispenser</h1>
	<p id="messinfoerr"></p>
	<br />
	<input type="text" id="caps" /> 
	<input type="button" id="add" value="Add x caps"/> 
	<br />
	
	<br />

</body>
</html>
1 голос
/ 27 марта 2020

Вы проверяете, является ли totcaps пустым, как это if (totcaps === "") {

Это означает, что вы проверяете, является ли totcaps пустой строкой. Вы можете проверить, является ли значение ложным, как это: if (!totcaps), но имейте в виду, что если значение равно 0, оно также будет считаться ложным.

В вашем коде измените значение === "" на === undefined и это будет работать.

https://www.sitepoint.com/javascript-truthy-falsy/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...