Как проверить и поменять атрибут на JS
Метод getAttribute('open') возвращает значение атрибута. У булевых атрибутов (таких как open, disabled, checked, hidden) значения нет, оно пустое (""). В JavaScript пустая строка приводится к false. Из-за этого тернарный оператор будет всегда думать, что атрибута нет, и пытаться добавить его снова.
Вот как это сделать правильно, от самого современного способа к классическому:
1. Идеальный вариант: toggleAttribute() (Современный стандарт)
В DOM API есть специальный метод именно для таких случаев. Он сам проверяет наличие и либо добавляет, либо удаляет атрибут.
button.addEventListener('click', () => {
modal.toggleAttribute('open');
});Это самый чистый, читаемый и правильный код для переключения булевых атрибутов.
2. Правильный ручной вариант: hasAttribute()
Если тебе по какой-то причине нужно написать условие вручную (например, ты делаешь что-то еще в ветках if/else), используй метод hasAttribute(). Он возвращает строгий boolean (true или false).
button.addEventListener('click', () => {
// Через if/else (читаемее)
if (modal.hasAttribute('open')) {
modal.removeAttribute('open');
} else {
modal.setAttribute('open', '');
}
});Или через тернарный оператор, как у тебя:
button.addEventListener('click', () => {
modal.hasAttribute('open') ? modal.removeAttribute('open') : modal.setAttribute('open', '');
});Бонус: Если modal — это тег <dialog>
Если твое модальное окно реализовано через нативный HTML тег <dialog>, то работать с атрибутами напрямую не рекомендуется. У этого элемента есть свои методы и свойства:
Через свойство DOM:
button.addEventListener('click', () => {
modal.open = !modal.open; // Переключаем свойство open
});Через API метода (Лучшая практика для <dialog>):
button.addEventListener('click', () => {
if (modal.open) {
modal.close(); // Закрывает диалог
} else {
modal.showModal(); // Открывает как модальное окно (с backdrop)
// или modal.show() для простого открытия без затемнения фона
}
});Резюме: Забудь про getAttribute для проверки наличия булевых атрибутов. Используй hasAttribute для проверки и toggleAttribute для переключения.