Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止在javascript计算器中选择多个运算符时出错?_Javascript_Html_Jquery - Fatal编程技术网

如何防止在javascript计算器中选择多个运算符时出错?

如何防止在javascript计算器中选择多个运算符时出错?,javascript,html,jquery,Javascript,Html,Jquery,我是一个制作JS计算器的新手。它工作正常,但如果您多次单击多个运算符或同一个运算符,它会出错,但如果您只单击一个运算符,它工作正常。。我不知道为什么,因为控制台里什么都没有。网上也没有。请帮忙 HTML: 自动控制 0 7. 8. 9 ÷ 4. 5. 6. x 1. 2. 3. - 0 . + = JS: (function() { "use strict"; // Shortcut to get elements var el = function(element) {

我是一个制作JS计算器的新手。它工作正常,但如果您多次单击多个运算符或同一个运算符,它会出错,但如果您只单击一个运算符,它工作正常。。我不知道为什么,因为控制台里什么都没有。网上也没有。请帮忙

HTML:


自动控制
0
7.
8.
9
÷
4.
5.
6.
x
1.
2.
3.
-
0
.
+
=

JS:

(function() {
  "use strict";

  // Shortcut to get elements
  var el = function(element) {
    if (element.charAt(0) === "#") { // If passed an ID...
      return document.querySelector(element); // ... returns single element
    }

    return document.querySelectorAll(element); // Otherwise, returns a nodelist
  };

  // Variables
  var viewer = el("#viewer"), // Calculator screen where result is displayed
    equals = el("#equals"), // Equal button
    nums = el(".num"), // List of numbers
    ops = el(".ops"), // List of operators
    theNum = "", // Current number
    oldNum = "", // First number
    resultNum, // Result
    operator; // Batman

  // When: Number is clicked. Get the current number selected
  var setNum = function() {
    if (resultNum) { // If a result was displayed, reset number
      theNum = this.getAttribute("data-num");
      resultNum = "";
    } else { // Otherwise, add digit to previous number (this is a string!)
      theNum += this.getAttribute("data-num");
    }

    viewer.innerHTML = theNum; // Display current number

  };

  // When: Operator is clicked. Pass number to oldNum and save operator
  var moveNum = function() {
    oldNum = theNum;
    theNum = "";
    operator = this.getAttribute("data-ops");

    equals.setAttribute("data-result", ""); // Reset result in attr
  };

  // When: Equals is clicked. Calculate result
  var displayNum = function() {

    // Convert string input to numbers
    oldNum = parseFloat(oldNum);
    theNum = parseFloat(theNum);

    // Perform operation
    switch (operator) {
      case "plus":
        resultNum = oldNum + theNum;
        break;

      case "minus":
        resultNum = oldNum - theNum;
        break;

      case "times":
        resultNum = oldNum * theNum;
        break;

      case "divided by":
        resultNum = oldNum / theNum;
        break;

        // If equal is pressed without an operator, keep number and continue
      default:
        resultNum = theNum;
    }

    // If NaN or Infinity returned
    if (!isFinite(resultNum)) {
      if (isNaN(resultNum)) { // If result is not a number; set off by, eg, double-clicking operators
        resultNum = "Error";
      } else { // If result is infinity, set off by dividing by zero
        resultNum = "Error";
        el('#calculator').classList.add("broken"); // Break calculator
      }
    }

    // Display result, finally!
    viewer.innerHTML = resultNum;
    equals.setAttribute("data-result", resultNum);

    // Now reset oldNum & keep result
    oldNum = 0;
    theNum = resultNum;

  };

  /* The click events */

  // Add click event to numbers
  for (let i = 0, l = nums.length; i < l; i++) {
    nums[i].onclick = setNum;
  }

  // Add click event to operators
  for (let i = 0, l = ops.length; i < l; i++) {
    ops[i].onclick = moveNum;
  }

  // Add click event to equal sign
  equals.onclick = displayNum;
  // When clear button is pressed clear everything
  function clear() {
    oldNum = "";
    theNum = "";
    viewer.innerHTML = "0";
    equals.setAttribute("data-result", resultNum);
  }
  el("#clear").onclick = clear;
}());
(函数(){
“严格使用”;
//获取元素的快捷方式
var el=函数(元素){
如果(element.charAt(0)==“#”){//如果传递了一个ID。。。
返回文档。querySelector(元素);/…返回单个元素
}
return document.queryselectoral(element);//否则返回节点列表
};
//变数
var viewer=el(“#viewer”),//显示结果的计算器屏幕
等于=el(“#等于”),//等于按钮
nums=el(“.num”),//数字列表
ops=el(“.ops”),//操作员列表
theNum=“”,//当前编号
oldNum=“”,//第一个数字
resultNum,//Result
接线员;//蝙蝠侠
//单击:编号时。获取当前选定的编号
var setNum=函数(){
如果(resultNum){//如果显示结果,则重置数字
theNum=this.getAttribute(“数据num”);
resultNum=“”;
}else{//否则,将数字添加到上一个数字(这是一个字符串!)
theNum+=this.getAttribute(“数据num”);
}
viewer.innerHTML=theNum;//显示当前编号
};
//单击运算符时。将编号传递给oldNum并保存运算符
var moveNum=函数(){
oldNum=鱼际;
theNum=“”;
operator=this.getAttribute(“数据操作”);
equals.setAttribute(“数据结果”,”);//重置属性中的结果
};
//单击:等于时。计算结果
var displayNum=函数(){
//将字符串输入转换为数字
oldNum=parseFloat(oldNum);
theNum=浮点数(theNum);
//执行操作
开关(操作员){
案例“附加”:
resultNum=oldNum+theNum;
打破
案例“减”:
resultNum=oldNum-theNum;
打破
案例“时代”:
resultNum=oldNum*theNum;
打破
案例“除以”:
resultNum=oldNum/theNum;
打破
//如果在没有运算符的情况下按equal,则保留数字并继续
违约:
结果额=足底;
}
//如果返回NaN或无穷大
如果(!isFinite(resultNum)){
if(isNaN(resultNum)){//if结果不是一个数字;由双击运算符等设置
resultNum=“Error”;
}else{//若结果为无穷大,则除以零
resultNum=“Error”;
el(“#计算器”).classList.add(“Break”);//Break计算器
}
}
//最后显示结果!
viewer.innerHTML=resultNum;
equals.setAttribute(“数据结果”,resultNum);
//现在重置oldNum并保留结果
oldNum=0;
theNum=结果num;
};
/*点击事件*/
//将单击事件添加到数字
for(设i=0,l=nums.length;i
如果在一行中单击两个操作数,则在一行中调用此函数两次:

var moveNum = function() {
  oldNum = theNum;
  theNum = "";
  operator = this.getAttribute("data-ops");

  equals.setAttribute("data-result", ""); // Reset result in attr
};
如果您执行两次操作且两行之间没有数字变化,则前两行将中断-在执行这两行操作之前,您需要验证您是否具有“theNum”值,否则您将第一次设置
oldNum=theNum
,然后设置
oldNum=“”
第二次参见下面的示例

(函数(){
“严格使用”;
//获取元素的快捷方式
var el=函数(元素){
如果(element.charAt(0)==“#”){//如果传递了一个ID。。。
返回文档。querySelector(元素);/…返回单个元素
}
return document.queryselectoral(element);//否则返回节点列表
};
//变数
window.fixOperators=false;
var viewer=el(“#viewer”),//显示结果的计算器屏幕
等于=el(“#等于”),//等于按钮
nums=el(“.num”),//数字列表
ops=el(“.ops”),//操作员列表
theNum=“”,//当前编号
oldNum=“”,//第一个数字
resultNum,//Result
接线员;//蝙蝠侠
//单击:编号时。获取当前选定的编号
var setNum=函数(){
如果(resultNum){//如果显示结果,则重置数字
theNum=this.getAttribute(“数据num”);
resultNum=“”;
}else{//否则,将数字添加到上一个数字(这是一个字符串!)
theNum+=this.getAttribute(“数据num”);
}
viewer.innerHTML=theNum;//显示当前编号
window.fixOperators=false;
};
//单击运算符时。将编号传递给oldNum并保存运算符
var moveNum=函数(){
if(window.fixOperators){
返回;
}
oldNum=鱼际;
theNum=“”;
operator=this.getAttribute(“数据操作”);
equals.setAttribute(“数据结果”,”);//重置属性中的结果
var moveNum = function() {
  oldNum = theNum;
  theNum = "";
  operator = this.getAttribute("data-ops");

  equals.setAttribute("data-result", ""); // Reset result in attr
};