Вместо этого вы можете использовать делегирование событий на теле. При щелчке проверьте, является ли выбранный элемент входом со значением - если это так, найдите соответствующую функцию для запуска на объекте, индексированном значениями (например, ADD
, SUB
).
Вы также можете использовать type="number"
, чтобы побудить пользователя вводить только цифры c значения:
const fns = {
ADD: (a, b) => a + b,
SUB: (a, b) => a - b,
MULT: (a, b) => a * b,
DIV: (a, b) => a / b,
}
const [no1, no2] = ['no1', 'no2'].map(id => document.getElementById(id));
document.body.addEventListener('click', (e) => {
if (!e.target.matches('input[value]')) {
return;
}
const { value } = e.target;
const fn = fns[value];
console.log(
fn(Number(no1.value), Number(no2.value))
);
});
<input type="number" id="no1">
<input type="number" id="no2">
<input type="button" value="ADD">
<input type="button" value="SUB">
<input type="button" value="MULT">
<input type="button" value="DIV">
Это может быть сделано еще короче (не выбирая элементы заранее, либо полагаясь на идентификаторы в окне, либо не сохраняя временные значения в переменных), но это будет менее эффективно и / или менее читабельно, поэтому я бы не рекомендовал это:
const fns = {
ADD: (a, b) => a + b,
SUB: (a, b) => a - b,
MULT: (a, b) => a * b,
DIV: (a, b) => a / b,
}
document.body.addEventListener('click', ({ target }) => {
if (target.matches('input[value]')) {
console.log(fns[target.value](Number(no1.value), Number(no2.value)));
}
});
<input type="number" id="no1">
<input type="number" id="no2">
<input type="button" value="ADD">
<input type="button" value="SUB">
<input type="button" value="MULT">
<input type="button" value="DIV">