Метод eval () с переменной в синтаксисе jQuery не работает - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь запустить калькулятор с минимально возможными JavaScript битами кода. Я использую jQuery, чтобы еще больше свести к минимуму раздел сценария. Но мой метод eval() не работает, хотя alert(executed) рядом с ним работает нормально! Что я делаю не так? Взгляните на то, что я пробовал до сих пор!

<!DOCTYPE html>
<html>

<head>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
  <meta charset="UTF-8" />
  <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.js"></script>
  <meta name="viewport" content="wclassth=device-wclassth, initial-scale=1.0">
  <style>
    .inp {
      font-weight: bolder;
      font-size: 5vw;
      width: 13vw;
      height: 13vw;
      margin-bottom: 2vw;
      margin-top: 2vw;
    }
    
    input:hover {
      color: red;
    }
  </style>
</head>

<body>
  <p>
    Answer will be shown here:
  </p>
  <br></br><br></br>
  <table style="background:black; padding:2vw; width:60vw; margin-left:20vw;">
    <th>
      <div id="display" style="width:56vw; height:15vw; background:skyblue; font-weight:bolder; font-size:5vw; color:red;"></div>
    </th>
    <tr>
      <td>
        <input class="inp" type="button" value="1" />
        <input class="inp" type="button" value="2" />
        <input class="inp" type="button" value="3" />
        <input class="inp" type="button" value="+" />
      </td>
    </tr>
    <tr>
      <td>
        <input class="inp" type="button" value="4" />
        <input class="inp" type="button" value="5" />
        <input class="inp" type="button" value="6" />
        <input class="inp" type="button" value="-" />
      </td>
    </tr>
    <tr>
      <td>
        <input class="inp" type="button" value="7" />
        <input class="inp" type="button" value="8" />
        <input class="inp" type="button" value="9" />
        <input class="inp" type="button" value="*" />
      </td>
    </tr>
    <tr>
      <td>
        <input class="inp" type="button" value="." />
        <input class="inp" type="button" value="0" />
        <input class="inp" type="button" value="/" />
        <input class="inp" type="button" value="ans" />
      </td>
    </tr>
  </table>
  <script>
    $(function() {
      $("input.inp").on("click", function() {
        if ($(this).val() != "ans") {
          var solve = $("#display").append($(this).val());
        }
        if ($(this).val() == "ans") {
          var result = eval(solve);
          $("p").html(eval(result));
          alert("executed");
        }
      });
    });
  </script>
</body>

</html>

Изменить: в этом коде была некоторая синтаксическая ошибка, которая, я надеюсь, теперь исправлена.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Строка parseInt() parseInt($("#display").append($(this).val()); не вернет то, что, по вашему мнению, она вернет, parseInt() попытается проанализировать результат .append(), который не является числовым значением c, это то, как я думаю, вы может реализовать это:

Также примечание по безопасности, пожалуйста, постарайтесь избегать использования eval(), проверьте это : Никогда не используйте eval

$(function () {
  $("input.inp").on("click", function () {
    let solv = $(this).val();
    if (solv != "ans") {    
      $("#display").append(solv);
    }

    if (solv == "ans") {
      let solve = $("#display").text();
      const result = calculateResult(solve);
      $("#ans").html(result);
    }
  });
});

function calculateResult(js) {
  return Function('"use strict";return (' + js + ")")();
}
.inp {
  font-weight: bolder;
  font-size: 5vw;
  width: 13vw;
  height: 13vw;
  margin-bottom: 2vw;
  margin-top: 2vw;
}
input:hover {
  color: red;
}
<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
        <meta charset="UTF-8" />
        <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.js"></script>
        <meta name="viewport" content="wclassth=device-wclassth, initial-scale=1.0" />
    </head>
    <body>
        <p>
            Answer will be shown here: <span id='ans'></span>
        </p>
        <table style="background: black; padding: 2vw; wclassth: 60vw; margin-left: 20vw;">
            <th><div id="display" style="wclassth: 56vw; height: 15vw; background: skyblue; font-weight: bolder; font-size: 5vw; color: red;"></div></th>
            <tr>
                <td>
                    <input class="inp" type="button" value="1" />
                    <input class="inp" type="button" value="2" />
                    <input class="inp" type="button" value="3" />
                    <input class="inp" type="button" value="+" />
                </td>
            </tr>
            <tr>
                <td>
                    <input class="inp" type="button" value="4" />
                    <input class="inp" type="button" value="5" />
                    <input class="inp" type="button" value="6" />
                    <input class="inp" type="button" value="-" />
                </td>
            </tr>
            <tr>
                <td>
                    <input class="inp" type="button" value="7" />
                    <input class="inp" type="button" value="8" />
                    <input class="inp" type="button" value="9" />
                    <input class="inp" type="button" value="*" />
                </td>
            </tr>
            <tr>
                <td>
                    <input class="inp" type="button" value="." />
                    <input class="inp" type="button" value="0" />
                    <input class="inp" type="button" value="/" />
                    <input class="inp" type="button" value="ans" />
                </td>
            </tr>
        </table>
    </body>
</html>
1 голос
/ 18 июня 2020

Вам нужно получить значение вашего #display, а затем передать его в вашу eval функцию, чтобы получить требуемый ответ.

Демо-код :

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
  <meta charset="UTF-8" />
  <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.js"></script>
  <meta name="viewport" content="wclassth=device-wclassth, initial-scale=1.0">
  <style>
    .inp {
      font-weight: bolder;
      font-size: 5vw;
      width: 13vw;
      height: 13vw;
      margin-bottom: 2vw;
      margin-top: 2vw;
    }
    
    input:hover {
      color: red;
    }
  </style>

  <p>
    Answer will be shown here: <span></span>
  </p>
  <br></br><br></br>
  <table style="background:black; padding:2vw; wclassth:60vw; margin-left:20vw;">
    <th>
      <div id="display" style="wclassth:56vw; height:15vw; background:skyblue; font-weight:bolder; font-size:5vw; color:red;"></div>
    </th>
    <tr>
      <td>
        <input class="inp" type="button" value="1" />
        <input class="inp" type="button" value="2" />
        <input class="inp" type="button" value="3" />
        <input class="inp" type="button" value="+" />
      </td>
    </tr>
    <tr>
      <td>
        <input class="inp" type="button" value="4" />
        <input class="inp" type="button" value="5" />
        <input class="inp" type="button" value="6" />
        <input class="inp" type="button" value="-" />
      </td>
    </tr>
    <tr>
      <td>
        <input class="inp" type="button" value="7" />
        <input class="inp" type="button" value="8" />
        <input class="inp" type="button" value="9" />
        <input class="inp" type="button" value="*" />
      </td>
    </tr>
    <tr>
      <td>
        <input class="inp" type="button" value="." />
        <input class="inp" type="button" value="0" />
        <input class="inp" type="button" value="/" />
        <input class="inp" type="button" value="ans" />
      </td>
    </tr>
  </table>
  <script>
    $(function() {
      $("input.inp").on("click", function() {

        if ($(this).val() != "ans") {
     $("#display").append($(this).val());//append new value
         
        }
        if ($(this).val() == "ans") {
       var solve = $("#display").text();//get value from display
          var result = eval(solve);//eval
          console.log(result)
          $("span").html(result);
          alert("executed");
        }
      });
    });
  </script>
...