
Эта серия упражнений поможет вам отточить навыки взаимодействия с HTML-документом с помощью JavaScript. Вы будете работать с готовой HTML-структурой простого калькулятора. Задачи включают получение элементов со страницы, чтение значений из полей ввода, добавление обработчиков событий на кнопки, выполнение арифметических операций и отображение результата обратно на странице. Упражнения расположены по возрастанию сложности: от выбора элементов до реализации полной логики калькулятора с базовой обработкой ошибок.
- Модуль 1: Основы выбора элементов
- Выбор элемента по ID.
- Выбор элементов по классу.
- Выбор элементов по тегу.
- Выбор по селектору CSS.
- Выбор по атрибуту.
- Поиск элементов внутри другого элемента.
- Поиск родительского элемента.
- Поиск соседних элементов (предыдущий, следующий).
- Поиск первого и последнего дочернего элемента.
- Поиск всех дочерних элементов.
- Модуль 2: Манипуляция содержимым
- Модуль 3: Работа с атрибутами
- Модуль 4: Управление классами
- Модуль 5: Управление стилями
- Модуль 6: Создание и удаление элементов
- Создание нового элемента.
- Вставка элемента перед другим элементом.
- Вставка элемента после другого элемента.
- Добавление элемента в определенную позицию внутри списка дочерних элементов.
- Удаление элемента из DOM.
- Замена одного элемента другим.
- Перемещение существующего элемента в другое место DOM..
- Очистка содержимого элемента без его удаления.
- Модуль 7: Обработка событий
- Модуль 8: Работа с формами
- Модуль 9: Продвинутые манипуляции
- Модуль 10: Работа с размерами и прокруткой
- Получение размеров элемента.
- Получение позиции элемента относительно окна браузера.
- Получение позиции элемента относительно родительского элемента.
- Управление прокруткой страницы.
- Определение, виден ли элемент в текущей области просмотра.
- Плавная прокрутка к элементу.
- Создание элемента, который фиксируется при прокрутке.
- Модуль 11: Работа с медиа-элементами
- Модуль 12: Практические задания
- Создание интерактивного списка задач (todo list).
- Создание простого калькулятора.
Получение элементов калькулятора
Ваша первая задача — получить доступ к основным элементам калькулятора на HTML-странице с помощью их идентификаторов (ID). Вам нужно получить ссылки на два поля ввода для чисел и на элемент, где будет отображаться результат.
<div class="calculator">
<input type="number" id="num1" placeholder="Первое число">
<input type="number" id="num2" placeholder="Второе число">
<button id="add">+</button>
<p>Результат: <span id="result">?</span></p>
</div>
// Получаем первое поле ввода
const num1Input = document.input__1('num1');
// Получаем второе поле ввода
const num2Input = document.input__2('num2');
// Получаем элемент для вывода результата
const resultSpan = document.getElementById(input__3);
// Для проверки (не изменять)
console.log('Найденные элементы:', num1Input, num2Input, resultSpan);
Чтение значений из полей ввода
Теперь, когда у вас есть ссылки на элементы, научимся читать значения, которые пользователь вводит в поля. Дополните код так, чтобы при клике на кнопку '+' значения из полей ввода считывались и выводились в консоль.
<div class="calculator">
<input type="number" id="num1" placeholder="Первое число" value="10">
<input type="number" id="num2" placeholder="Второе число" value="5">
<button id="add">+</button>
<p>Результат: <span id="result">?</span></p>
</div>
const num1Input = document.getElementById('num1');
const num2Input = document.getElementById('num2');
const addButton = document.input__1('add');
const resultSpan = document.getElementById('result');
addButton.input__2('click', function() {
// Получаем значение из первого поля
const value1 = num1Input.input__3;
// Получаем значение из второго поля
const value2 = num2Input.input__4;
// Выводим значения в консоль для проверки
console.log('Значение 1:', value1);
console.log('Значение 2:', value2);
// Пока не выводим результат на страницу
// resultSpan.textContent = ...;
});
Выполнение сложения и вывод результата
Объединим предыдущие шаги. Дополните код так, чтобы при клике на кнопку '+' значения из полей ввода считывались, преобразовывались в числа, складывались, и результат выводился в элемент `span` с ID 'result'.
<div class="calculator">
<input type="number" id="num1" placeholder="Первое число" value="15">
<input type="number" id="num2" placeholder="Второе число" value="7">
<button id="add">+</button>
<p>Результат: <span id="result">?</span></p>
</div>
const num1Input = document.getElementById('num1');
const num2Input = document.getElementById('num2');
const addButton = document.getElementById('add');
const resultSpan = document.getElementById('result');
addButton.addEventListener('click', function() {
// Получаем и преобразуем значения в числа
const num1 = input__1(num1Input.value);
const num2 = input__2(num2Input.value);
// Выполняем сложение
const sum = num1 input__3 num2;
// Выводим результат на страницу
resultSpan.input__4 = sum;
});
Добавление других операций (кнопки)
Расширим калькулятор, добавив кнопки для вычитания, умножения и деления. Вам нужно добавить обработчики событий для новых кнопок и реализовать соответствующую логику вычислений для каждой операции.
.calculator button { margin: 0 5px; }
<div class="calculator">
<input type="number" id="num1" placeholder="Первое число" value="20">
<input type="number" id="num2" placeholder="Второе число" value="4">
<button id="add">+</button>
<button id="subtract">-</button>
<button id="multiply">*</button>
<button id="divide">/</button>
<p>Результат: <span id="result">?</span></p>
</div>
const num1Input = document.getElementById('num1');
const num2Input = document.getElementById('num2');
const resultSpan = document.getElementById('result');
// Функция для выполнения операции и вывода результата
function calculate(operator) {
const num1 = parseFloat(num1Input.value);
const num2 = parseFloat(num2Input.value);
let calculationResult;
if (operator === '+') {
calculationResult = num1 + num2;
} else if (operator === input__1) { // Вычитание
calculationResult = num1 - num2;
} else if (operator === input__2) { // Умножение
calculationResult = num1 * num2;
} else if (operator === '/') { // Деление
calculationResult = num1 / num2;
}
resultSpan.textContent = calculationResult;
}
// Добавляем обработчики
document.getElementById('add').addEventListener('click', function() { calculate('+'); });
document.getElementById('subtract').addEventListener(input__3, function() { calculate('-'); });
document.getElementById('multiply').addEventListener('click', function() { calculate('*'); });
document.getElementById(input__4).addEventListener('click', function() { calculate('/'); });
Использование Select для выбора операции
Альтернативный способ выбора операции — использование выпадающего списка (`<select>`). Замените кнопки на `<select>` и измените JavaScript так, чтобы операция выбиралась из списка, а вычисление происходило по нажатию одной кнопки 'Вычислить'.
.calculator select, .calculator button { margin: 5px 0; }
<div class="calculator">
<input type="number" id="num1" placeholder="Первое число" value="100">
<input type="number" id="num2" placeholder="Второе число" value="25">
<select id="operation">
<option value="+">Сложение (+)</option>
<option value="-">Вычитание (-)</option>
<option value="*">Умножение (*)</option>
<option value="/">Деление (/)</option>
</select>
<button id="calculate">Вычислить</button>
<p>Результат: <span id="result">?</span></p>
</div>
const num1Input = document.getElementById('num1');
const num2Input = document.getElementById('num2');
const operationSelect = document.getElementById(input__1);
const calculateButton = document.getElementById('calculate');
const resultSpan = document.getElementById('result');
calculateButton.addEventListener('click', function() {
const num1 = parseFloat(num1Input.value);
const num2 = parseFloat(num2Input.value);
const operator = operationSelect.input__2; // Получаем выбранную операцию
let calculationResult;
switch (input__3) { // Проверяем выбранный оператор
case '+':
calculationResult = num1 + num2;
break;
case '-':
calculationResult = num1 - num2;
break;
case '*':
calculationResult = num1 * num2;
break;
case '/':
calculationResult = num1 / num2;
break;
default:
calculationResult = 'Неизвестная операция';
}
resultSpan.textContent = input__4;
});
Обработка ошибки: Деление на ноль
Добавим простую проверку ошибок. Модифицируйте код калькулятора (версию с кнопками) так, чтобы при попытке деления на ноль выводилось сообщение об ошибке, а не 'Infinity'.
.calculator button { margin: 0 5px; }
.error { color: red; font-weight: bold; }
<div class="calculator">
<input type="number" id="num1" placeholder="Первое число" value="10">
<input type="number" id="num2" placeholder="Второе число" value="0">
<button id="add">+</button>
<button id="subtract">-</button>
<button id="multiply">*</button>
<button id="divide">/</button>
<p>Результат: <span id="result">?</span></p>
</div>
const num1Input = document.getElementById('num1');
const num2Input = document.getElementById('num2');
const resultSpan = document.getElementById('result');
function calculate(operator) {
const num1 = parseFloat(num1Input.value);
const num2 = parseFloat(num2Input.value);
let calculationResult;
resultSpan.classList.remove('error'); // Убираем класс ошибки если был
if (operator === '+') {
calculationResult = num1 + num2;
} else if (operator === '-') {
calculationResult = num1 - num2;
} else if (operator === '*') {
calculationResult = num1 * num2;
} else if (operator === '/') {
// Проверяем деление на ноль
if (input__1 input__2 0) {
calculationResult = num1 / num2;
} else {
calculationResult = input__3; // Сообщение об ошибке
resultSpan.classList.add(input__4); // Добавляем класс для стилизации ошибки
}
}
resultSpan.textContent = calculationResult;
}
document.getElementById('add').addEventListener('click', function() { calculate('+'); });
document.getElementById('subtract').addEventListener('click', function() { calculate('-'); });
document.getElementById('multiply').addEventListener('click', function() { calculate('*'); });
document.getElementById('divide').addEventListener('click', function() { calculate('/'); });
Обработка ошибки: Нечисловые значения
Улучшим обработку ошибок. Добавьте проверку, являются ли введенные значения числами. Если хотя бы одно из значений не является числом (например, пользователь ввел текст), выведите сообщение об ошибке.
.calculator button { margin: 0 5px; }
.error { color: red; font-weight: bold; }
<div class="calculator">
<input type="text" id="num1" placeholder="Первое число" value="15">
<input type="text" id="num2" placeholder="Второе число" value="abc">
<button id="add">+</button>
<button id="subtract">-</button>
<button id="multiply">*</button>
<button id="divide">/</button>
<p>Результат: <span id="result">?</span></p>
</div>
const num1Input = document.getElementById('num1');
const num2Input = document.getElementById('num2');
const resultSpan = document.getElementById('result');
function calculate(operator) {
const num1 = parseFloat(num1Input.value);
const num2 = parseFloat(num2Input.value);
let calculationResult;
resultSpan.classList.remove('error');
// Проверяем, являются ли введенные значения числами
if (input__1(num1) || input__2(num2)) {
calculationResult = 'Ошибка: Введите числа!';
resultSpan.classList.add('error');
} else {
// Выполняем операцию, если оба значения - числа
switch (operator) {
case '+':
calculationResult = num1 + num2;
break;
case '-':
calculationResult = num1 - num2;
break;
case '*':
calculationResult = num1 * num2;
break;
case '/':
if (num2 !== 0) {
calculationResult = num1 / num2;
} else {
calculationResult = 'Деление на ноль!';
resultSpan.classList.add(input__3);
}
break;
default:
calculationResult = 'Неизвестная операция';
resultSpan.classList.add('error');
}
}
resultSpan.input__4 = calculationResult;
}
document.getElementById('add').addEventListener('click', function() { calculate('+'); });
document.getElementById('subtract').addEventListener('click', function() { calculate('-'); });
document.getElementById('multiply').addEventListener('click', function() { calculate('*'); });
document.getElementById('divide').addEventListener('click', function() { calculate('/'); });