I'm building a calculator that is supposed to calculate the contents of a string. For this I am using a Function object, however, upon running the code I get a value of undefined. I'm assuming this has something to do with the global scope of the Function object, but I can't see a way of debugging whats going on in that function. Passing it a local variable would solve the problem, but I can't figure out how.
let addListeners = function () {
screens = document.querySelectorAll("[class=screen]");
operationsButtons = document.querySelectorAll("[class^=operations_button]");
initAttributes();
addNumberButtonListeners();
addOperationsListeners();
addOtherButtons();
}
function addNumberButtonListeners() {
numberButtons = document.querySelectorAll("[id^=number]");
numberButtons.forEach(button => {
button.addEventListener("click", function () {
let buttonNumber = button.innerText;
screens.forEach(screen => {
screen.numberLast = true;
if (screen.isDefault) {
screen.innerText = buttonNumber;
screen.isDefault = false;
if (screen.id == "little_screen") {
screen.value = screen.innerText;
}
}
else {
screen.innerText += buttonNumber;
if (screen.id == "little_screen") {
screen.value = screen.innerText;
}
}
})
})
});
}
function addOperationsListeners() {
let littlescreen = document.querySelector("[id=little_screen]");
let bigscreen = document.querySelector("[id=big_screen]");
operationsButtons.forEach(button => {
button.addEventListener("click", function () {
try {
if (littlescreen.numberLast == false) throw button.innerText;
littlescreen.innerText = (littlescreen.innerText + button.innerText);
bigscreen.isDefault = true;
littlescreen.numberLast = false;
littlescreen.value = littlescreen.innerText;
}
catch (e) {
let str = littlescreen.innerText;
littlescreen.innerText = (str.slice(0, -1) + button.innerText);
littlescreen.value = littlescreen.innerText;
console.log(e + " twice");
}
})
})
}
function addOtherButtons() {
allClear = function () {
button = document.querySelector("[id=all_clear]");
button.addEventListener("click", function () {
screens.forEach(screen => {
screen.innerText = "0";
screen.isDefault = true;
if (screen.id == "big_screen") {
screen.numberLast = false;
}
})
})
}
equalsButton = function () {
let littlescreen = document.querySelector("[id=little_screen]");
button = document.querySelector("[id=equals]");
button.addEventListener("click", function () {
screens.forEach(screen => {
screen.isDefault = true;
if (screen.id == "big_screen") {
screen.numberLast = false;
// Function I can't get to work.
//littlescreen.innertext is string to be calculated.
console.log(littlescreen.innerText);
let calculate = function () {
screen = document.querySelector("[id=little_screen]");
screen.innerText = screen.innerText.slice(0, -1);
return screen.innerText;
}
console.log(calculate());
}
else {
littlescreen.innerText = (littlescreen.innerText + button.innerText);
}
})
})
}
//add pow()
//add decimal
//add +/-
allClear();
equalsButton();
}
function initAttributes() {
screens.forEach(screen => {
Object.defineProperty(screen, "isDefault", {
value: true,
writable: true,
});
if (screen.id == "little_screen") {
Object.defineProperty(screen, "numberLast", {
value: false,
writable: true,
});
Object.defineProperty(screen, "value", {
value: null,
writable: true,
});
}
console.log(screen);
});
}
addListeners()
.container{
display: flex;
justify-content: center;
}
.calccontainer{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
width:calc((2/3) * 100vh);
background: #D6D1B1;
border: 3px solid gray;
border-radius: 20px;
}
.screencontainer{
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
height: 20vh;
width: 80%;
background: #eef5db;
border: 3px solid gray;
border-radius: 20px;
margin: 5%;
margin-top: 7%;
}
#little_screen, #big_screen{
width: 80%;
text-align: right;
font-family: 'Seven Segment', sans-serif;
overflow: hidden;
}
#little_screen{
height: 25%;
font-size: 5vh;
}
#big_screen{
height: 50%;
font-size: 10vh;
}
.buttoncontainer{
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
height: 70vh;
width: 80%;
border-radius: 20px;
margin: 0 5% 5% 5%;
}
.number_button, .operations_button, .other_button{
display: flex;
justify-content: center;
align-items: center;
height: 10vh;
width: 20%;
border: 3px solid gray;
border-radius: 15px;
}
#all_clear{
width: 46%;
flex-shrink: 0;
background: #E3C498;
}
[id^="number"], #positive_negative, #decimal {
background: #BAE9C4;
}
[id^="button"] {
background: #F0B67F;
}
#equals{
background: #fe5f55;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Page Title</title>
<link rel="stylesheet" href="style.css">
<script src="script.js" defer></script>
<link href="http://fonts.cdnfonts.com/css/seven-segment" rel="stylesheet">
</head>
<body style="margin: 0;">
<!-- Removes white border around page-->
<div class="container" id="container">
<div class="calccontainer" id="calccontainer">
<div class="screencontainer" id="screencontainer">
<div class="screen" id="little_screen">0</div>
<div class="screen" id="big_screen">0</div>
</div>
<div class="buttoncontainer" id="innercontainer">
<div class="other_button" id="all_clear">AC</div>
<div class="other_button" id="button2">Xy</div>
<div class="operations_button" id="button3">/</div>
<div class="number_button" id="number7">7</div>
<div class="number_button" id="number8">8</div>
<div class="number_button" id="number9">9</div>
<div class="operations_button" id="button7">*</div>
<div class="number_button" id="number4">4</div>
<div class="number_button" id="number5">5</div>
<div class="number_button" id="number6">6</div>
<div class="operations_button" id="button11">-</div>
<div class="number_button" id="number1">1</div>
<div class="number_button" id="number2">2</div>
<div class="number_button" id="number3">3</div>
<div class="operations_button" id="button15">+</div>
<div class="other_button" id="positive_negative">+/-</div>
<div class="number_button" id="number0">0</div>
<div class="other_button" id="decimal">.</div>
<div class="other_button" id="equals">=</div>
</div>
</div>
</div>
</body>
</html>
I know using eval() would work, but I'm trying to stay away from it. I have a console.log that gives the value of the string that's supposed to calculate that triggers what you try to calculate something by pressing the equals button.
EDIT: So I made a couple changes and am no longer getting undefined, however now I'm just getting the string passed to me without a calculation.
let calculate = function () {
screen = document.querySelector("[id=little_screen]");
screen.innerText = screen.innerText.slice(0, -1);
return screen.innerText;