ugly_calculator/main.js

71 lines
1.8 KiB
JavaScript

document.querySelectorAll(".calc-container input[type=button]").forEach((e) => {
e.onclick = () => {
const c = e.value;
const out = document.querySelector(".calc-container input[name=out]");
if (c == "=") {
try {
out.value = calc(out.value);
} catch (e) {
out.value = "Error";
}
}
else if (e.name == "clear") {
if (out.value.length > 0)
out.value = out.value.substring(0, out.value.length - 1);
} else out.value += e.value;
}
});
let clearScreenTimmer = null;
const createTimmer = () => {
clearScreenTimmer = setTimeout(() => {
const out = document.querySelector(".calc-container input[name=out]");
out.value = "";
}, 1000);
}
const removeTimmer = () => {
if (clearScreenTimmer) clearTimeout(clearScreenTimmer);
}
document.querySelector(".calc-container input[name=clear]").onmousedown = createTimmer;
document.querySelector(".calc-container input[name=clear]").onmouseup = removeTimmer;
document.querySelector(".calc-container input[name=clear]").ontouchstart = createTimmer;
document.querySelector(".calc-container input[name=clear]").ontouchend = removeTimmer;
const oprs = ["-", "+", "*", "/"];
const calc = (infix, opr = 0) => {
infix = infix.replace(" ", "");
let answer = null;
let parts = infix.split(oprs[opr]);
for (let i = 0; i < parts.length; i++) {
let num = Number(parts[i]);
if (isNaN(num) && opr < oprs.length)
num = calc(parts[i], opr + 1);
if (answer == null) {
answer = num;
continue;
}
switch (opr) {
case 3:
answer /= num;
break;
case 2:
answer *= num;
break;
case 1:
answer += num;
break;
case 0:
answer -= num;
break;
}
}
return answer;
}