Можно ли по другому сделать кнопки для калькулятора?
Делаю калькулятор и весь код рабочий, но хотел бы узнать, можно ли как-нибудь по другому(более компактно) оформить функцию нажатия кнопок.
let digitsField = document.getElementById("digit-field");
// buttons
let clear = document.getElementById("AC");
let plusOrMinus = document.getElementById("plusMinus");
let percent = document.getElementById("percent");
let divide = document.getElementById("divide");
let seven = document.getElementById("seven");
let eight = document.getElementById("eight");
let nine = document.getElementById("nine");
let multiple = document.getElementById("multiple");
let four = document.getElementById("four");
let five = document.getElementById("five");
let six = document.getElementById("six");
let minus = document.getElementById("seven");
let one = document.getElementById("one");
let two = document.getElementById("two");
let three = document.getElementById("three");
let plus = document.getElementById("plus");
let zero = document.getElementById("zero");
let comma = document.getElementById("comma");
let equal = document.getElementById("equal");
let forNumbers = document.getElementById("forNumbers");
// Вот это хочу оформить компактнее
one.addEventListener("click", () => {
forNumbers.textContent += "1";
});
two.addEventListener("click", () => {
forNumbers.textContent += "2";
});
three.addEventListener("click", () => {
forNumbers.textContent += "3";
});
four.addEventListener("click", () => {
forNumbers.textContent += "4";
});
five.addEventListener("click", () => {
forNumbers.textContent += "5";
});
six.addEventListener("click", () => {
forNumbers.textContent += "6";
});
seven.addEventListener("click", () => {
forNumbers.textContent += "7";
});
eight.addEventListener("click", () => {
forNumbers.textContent += "8";
});
nine.addEventListener("click", () => {
forNumbers.textContent += "9";
});
zero.addEventListener("click", () => {
forNumbers.textContent += "0";
});
@import url("https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap");
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: #7bb9ff;
font-family: "Roboto Condensed", sans-serif;
}
.container {
width: 90%;
display: flex;
flex-direction: column;
align-items: center;
margin: auto;
border: 5px solid orange;
height: 100vh;
}
#header {
margin-top: 25px;
font-size: 50px;
}
.calculator {
width: 40%;
margin-top: 10px;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
#digit-field {
width: 100%;
height: 100px;
background-color: #3f3f3f;
}
#buttons-field {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.row-1, .row-2, .row-3, .row-4, .row-5 {
width: 100%;
display: flex;
justify-content: space-between;
height: 147px;
}
.calc-btns {
width: 100%;
background-color: rgb(157, 255, 206);
font-size: 70px;
border: 2px solid black;
transition: 0.3s;
}
.calc-btns:hover {
background-color: orange;
}
#forNumbers {
width: 90%;
height: 100%;
font-size: 50px;
color: white;
font-weight: 500;
display: flex;
align-items: center;
margin-left: 15px;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script defer src="script.js"></script>
<link rel="stylesheet" href="./styles//styles.css" />
<title>Caclucator</title>
</head>
<body>
<main class="container">
<h1 id="header">MY CACLUCATOR</h1>
<div class="calculator">
<div id="digit-field"><span id="forNumbers"></span></div>
<div id="buttons-field">
<div class="row-1">
<button class="calc-btns" id="AC">AC</button>
<button class="calc-btns" id="plusMinus">+/-</button>
<button class="calc-btns" id="percent">%</button>
<button class="calc-btns" id="divide">/</button>
</div>
<div class="row-2">
<button class="calc-btns" id="seven">7</button>
<button class="calc-btns" id="eight">8</button>
<button class="calc-btns" id="nine">9</button>
<button class="calc-btns" id="multiple">X</button>
</div>
<div class="row-3">
<button class="calc-btns" id="four">4</button>
<button class="calc-btns" id="five">5</button>
<button class="calc-btns" id="six">6</button>
<button class="calc-btns" id="minus">-</button>
</div>
<div class="row-4">
<button class="calc-btns" id="one">1</button>
<button class="calc-btns" id="two">2</button>
<button class="calc-btns" id="three">3</button>
<button class="calc-btns" id="plus">+</button>
</div>
<div class="row-5">
<button class="calc-btns" id="zero">0</button>
<button class="calc-btns" id="comma">,</button>
<button class="calc-btns" id="equal">=</button>
</div>
</div>
</div>
</main>
</body>
</html>
Ответы (2 шт):
Я бы добавил кнопкам data атрибуты, и повесил слушатель события на блок с кнопками
const $buttonsField = document.getElementById('buttons-field')
const $forNumbers = document.getElementById('forNumbers')
$buttonsField.addEventListener('click', (e) => {
const actionNode = e.target.closest('[data-action]')
const valueNode = e.target.closest('[data-value]')
if (actionNode) {
return doAction(actionNode.dataset.action)
}
if (valueNode) {
return onNumberInput(valueNode.dataset.value)
}
})
function onNumberInput(num) {
$forNumbers.textContent += num
}
function doAction(action) {
switch (action) {
case 'sum':
return sum()
case 'multiply':
return multiply()
// ...
}
}
function sum() {
console.log('sum')
}
function multiply() {
console.log('multiply')
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script defer src="script.js"></script>
<link rel="stylesheet" href="./styles//styles.css" />
<title>Caclucator</title>
</head>
<body>
<main class="container">
<h1 id="header">MY CACLUCATOR</h1>
<div class="calculator">
<div id="digit-field"><span id="forNumbers"></span></div>
<div id="buttons-field">
<div class="row-1">
<button class="calc-btns" data-action="AC">AC</button>
<button class="calc-btns" data-action="+/-">+/-</button>
<button class="calc-btns" data-action="percent">%</button>
<button class="calc-btns" data-action="divide">/</button>
</div>
<div class="row-2">
<button class="calc-btns" data-value="7">7</button>
<button class="calc-btns" data-value="8">8</button>
<button class="calc-btns" data-value="9">9</button>
<button class="calc-btns" data-action="multiply">X</button>
</div>
<div class="row-3">
<button class="calc-btns" data-value="4">4</button>
<button class="calc-btns" data-value="5">5</button>
<button class="calc-btns" data-value="6">6</button>
<button class="calc-btns" data-action="minus">-</button>
</div>
<div class="row-4">
<button class="calc-btns" data-value="1">1</button>
<button class="calc-btns" data-value="2">2</button>
<button class="calc-btns" data-value="3">3</button>
<button class="calc-btns" data-action="sum">+</button>
</div>
<div class="row-5">
<button class="calc-btns" data-value="0">0</button>
<button class="calc-btns" data-value=",">,</button>
<button class="calc-btns" data-action="result">=</button>
</div>
</div>
</div>
</main>
</body>
</html>
Длинные имена часто используемых функций можно прятать в переменные ссылки:
let gebi = function(id) {return document.getElementById(id)};
Слушалки не обязательно вешать вручную(можно попробовать циклы).
Слушалки не обязательно вешать прямо в коде js, можно использовать старый добрый dHTML, например так:
<button class="calc-btns" id="seven" ONCLICK='forNumbers.textContent += "7";'>7
Есть кнопки инпуты, если не требуется вешать слушалку клика на кучу разношерстного контента(смесь из текста, тегов и картинок), желательно использовать их.
<input type='button' value='1' ONCLICK='forNumbers.textContent += "1";'/>
let digitsField = document.getElementById("digit-field");
@import url("https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap");
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: #7bb9ff;
font-family: "Roboto Condensed", sans-serif;
}
.container {
width: 90%;
display: flex;
flex-direction: column;
align-items: center;
margin: auto;
border: 5px solid orange;
height: 100vh;
}
#header {
margin-top: 25px;
font-size: 50px;
}
.calculator {
width: 40%;
margin-top: 10px;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
#digit-field {
width: 100%;
height: 100px;
background-color: #3f3f3f;
}
#buttons-field {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.row-1, .row-2, .row-3, .row-4, .row-5 {
width: 100%;
display: flex;
justify-content: space-between;
height: 147px;
}
.calc-btns{
width: 100%;
background-color: rgb(157, 255, 206);
font-size: 70px;
border: 2px solid black;
transition: 0.3s;
}
.calc-btns:hover{
background-color: orange;
}
#forNumbers {
width: 90%;
height: 100%;
font-size: 50px;
color: white;
font-weight: 500;
display: flex;
align-items: center;
margin-left: 15px;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script defer src="script.js"></script>
<link rel="stylesheet" href="./styles//styles.css" />
<title>Caclucator</title>
</head>
<body>
<main class="container">
<h1 id="header">MY CACLUCATOR</h1>
<div class="calculator">
<div id="digit-field"><span id="forNumbers"></span></div>
<div id="buttons-field">
<div class="row-1">
<button class="calc-btns" id="AC">AC</button>
<button class="calc-btns" id="plusMinus">+/-</button>
<button class="calc-btns" id="percent">%</button>
<button class="calc-btns" id="divide">/</button>
</div>
<div class="row-2">
<input class="calc-btns" type='button' value='7' id='seven' ONCLICK='forNumbers.textContent += "7";'/>
<input class="calc-btns" type='button' value='8' id='eight' ONCLICK='forNumbers.textContent += "8";'/>
<input class="calc-btns" type='button' value='9' id='nine' ONCLICK='forNumbers.textContent += "9";'/>
<button class="calc-btns" id="multiple">X</button>
</div>
<div class="row-3">
<input class="calc-btns" type='button' value='4' id='four' ONCLICK='forNumbers.textContent += "4";'/>
<input class="calc-btns" type='button' value='5' id='five' ONCLICK='forNumbers.textContent += "5";'/>
<input class="calc-btns" type='button' value='6' id='six' ONCLICK='forNumbers.textContent += "6";'/>
<button class="calc-btns" id="minus">-</button>
</div>
<div class="row-4">
<button class="calc-btns" id="one">1</button>
<button class="calc-btns" id="two">2</button>
<button class="calc-btns" id="three">3</button>
<button class="calc-btns" id="plus">+</button>
</div>
<div class="row-5">
<button class="calc-btns" id="zero">0</button>
<button class="calc-btns" id="comma">,</button>
<button class="calc-btns" id="equal">=</button>
</div>
</div>
</div>
</main>
</body>
</html>