如何防止在javascript计算器中选择多个运算符时出错?
我是一个制作JS计算器的新手。它工作正常,但如果您多次单击多个运算符或同一个运算符,它会出错,但如果您只单击一个运算符,它工作正常。。我不知道为什么,因为控制台里什么都没有。网上也没有。请帮忙 HTML:如何防止在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) {
自动控制
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
};