DevGang
Авторизоваться

Как управлять DOM на чистом JavaScript?

Управление DOM с помощью JavaScript в современных браузерах и IE 11+

Добавить или удалить класс из элемента Разрешить ввод только определенных символов Добавить к элементу Подписаться на событие Вычислить положение мыши относительно элемента Рассчитать размер полосы прокрутки Изменить favicon Проверить элемент по селектору Проверка наличия класса у элемента Проверьте, является ли элемент потомком другого Проверьте, находится ли элемент в области просмотра Проверка, является ли элемент прокручиваемым Проверка, поддерживается ли ввод даты Клонировать элемент Связь между iframe и его родительским окном Скопировать текст в буфер обмена Подсчитайте количество символов текстовой области Создать элемент Создать слайдер сравнения изображений Создать одноразовый обработчик событий Создание изменяемых размеров разделенных видов Обнаружение кликов за пределами элемента Определить, находится ли элемент в фокусе Определите, включен ли caps-lock Как определить Mac OS браузер Определить высоту и ширину элемента Определение левый и правый клик мыши Скачать файл Перетаскивание элементов в списоке Перетаскивание столбецов таблицы Перетаскивание строки таблицы Выполнить код, когда документ готов Экспорт таблицы в CSV Получить CSS-стили элемента Получить или установить заголовок документа Получить или установить HTML-элемент Получить, установить и удалить атрибуты Получить установить и удалить атрибуты data Получить братьев и сестер элемента Получить размер выбранного файла Получить ближайший элемент по данному селектору Получить значение по умолчанию для свойства css Получиту высоту и ширину документа Получить первый прокручиваемый родительский элемент Получить родительский элемент Получить положение элемента относительно другого Получить позицию элемента относительно документа Получить размер изображения Получить текстовое содержимое элемента Вернуться на предыдущую страницу Выделите элемент при перетаскивании файла поверх него Вставить элемент после или перед другим элементом Вставить данный HTML после или перед элементом Загрузить файл CSS динамически Загрузить файл JavaScript динамически Цикл по нодлисту Сделать изменяемый размер элемента Вставить изображение из буфера обмена Placeholder для contenteditable Нажмите Shift и введите новую строку Предварительный просмотр изображения перед его загрузкой Поместить курсор в конец ввода Перенаправить на другую страницу Перезагрузить текущую страницу Удалить все дочерние узлы Удалить элемент Заменить элемент Заменить элемент Заменить сломанные изображения Измените размер фрейма, чтобы он соответствовал его содержанию Изменить размер изображения Изменить размер столбцов таблицы Измените ширину текстового поля, чтобы оно автоматически соответствовало его содержимому Масштабировать текст, чтобы он поместился внутри элемента Прокрутить до верхней части страницы Выберите элемент или список элементов Выберите дочерние элементы Сериализация данных формы в строку запроса Показывать фальшивый элемент при перетаскивании элемента Сортировка таблицы, нажав на ее заголовки Поменять местами два узла Скрыть / показать элемент Переключить видимость пароля Запустить событие Развернуть элемент Загрузить файлы с помощью AJAX Обернуть элемент вокруг данного элемента

В этом примере мы заставим пользователей вводить символы только из данного набора. В частности, поддерживаемые символы в этой демонстрации включают цифры и пробел. Конечно, вы можете применить эту идею и к другим персонажам.

Вот наш элемент ввода:

<input type="text" id="input" />

1. Обработка событий

Обрабатывая событие keypress, мы можем запретить пользователю вводить символы, кроме цифр и пробела:

const ele = document.getElementById('input');

ele.addEventListener('keypress', function(e) {
    // Get the code of pressed key
    const key = e.which || e.keyCode;

    // 0, 1, ..., 9 have key code of 48, 49, ..., 57, respectively
    // Space has key code of 32
    if (key != 32 && (key < 48 || key > 57)) {
        // Prevent the default action
        e.preventDefault();
    }
});

Выглядит хорошо, но этого недостаточно, поскольку пользователь все еще может вставлять или перетаскивать неподдерживаемые символы в инпут. Эти случаи могут быть обработаны событием input:

// Track the current value
let currentValue = ele.value || '';

ele.addEventListener('input', function(e) {
    const target = e.target;

    // If users enter supported character (digits or space)
    /^[0-9\s]*$/.test(target.value)
        // Backup the current value
        ? currentValue = target.value
        // Otherwise, restore the value
        // Note that in this case, `e.preventDefault()` doesn't help
        : target.value = currentValue;
});

Здесь мы проверяем, соответствует ли значение регулярному выражению /^[0-9\s]*$/, которое охватывает цифры и пробелы.

Он исправляет случаи, когда пользователи вставляют с клавиатуры (Ctrl + V), контекстного меню или перетаскивают текст в инпут.

Но есть и другая проблема. Вызов target.value = currentValue поместит курсор в конец ввода. Мы должны сохранить позицию курсора.

// Track the current cursor's position
const selection = {};

ele.addEventListener('keydown', function(e) {
    const target = e.target;
    selection = {
        selectionStart: target.selectionStart,
        selectionEnd: target.selectionEnd,
    };
});

Когда пользователь изменит входное значение, мы восстановим и значение, и позиции выбора, если значение не поддерживается:

ele.addEventListener('input', function(e) {
    const target = e.target;

    if (/^[0-9s]*$/.test(target.value)) {
        currentValue = target.value;
    } else {
        // Users enter the not supported characters
        // Restore the value and selection
        target.value = currentValue;
        target.setSelectionRange(
            selection.selectionStart,
            selection.selectionEnd
        );
    }
});

Мы можем объединить отслеживаемые свойств (value, selectionStart и selectionEnd) к одной переменной.

2. Используйте специальный тип инпута

Мы можем использовать специальный тип HTML 5 для обслуживания конкретных случаев использования:

input Описание
<input type="color" /> Позвольте пользователю указать цвет
<input type="date" /> Позвольте пользователю ввести дату
<input type="email" /> Позвольте пользователю ввести адрес электронной почты
<input type="number" /> Разрешить пользователю вводить только цифры
<input type="tel" /> Позвольте пользователю ввести номер телефона
<input type="time" /> Позвольте пользователю ввести время
<input type="url" /> Позвольте пользователю ввести URL

Есть больше встроенных типов, которые вы можете изучить здесь.

В нашем конкретном примере <input type="number" /> это не помогает, потому что не позволяет ввести пробел.

Комментарии
Чтобы оставить комментарий, необходимо авторизоваться