Через пятьдесят лет, когда автомобили самостоятельно управляют дорогой, что происходит, когда кто-то должен вручную водить? Неисправности автопилота и мой Великий внук, Уэстон, должны вернуться домой, чтобы посмотреть, как Cavs играют воины в игре Seven из финалов НБА, потому что современное лекарство выяснило, как лентон и карри, играя в верхней части эффективности в своих 80-х годах. Отказ
Но Уэстон только вручную проехал машину один или два раза в своей жизни, впервые на смелость от друга, который привел к частичному поклонению гаражного залива его родителей.
Несмотря на невероятные возможности современных структур JS, таких как реагирование, угловые и Vue, мы, вероятно, все чувствуем себя немного похоже на WESTON, когда речь идет о том, чтобы написать простые старые JS без костылями рамки.
Я работаю над Приложение чата в React/Socket.IO/Express Если пользователи могут нажать на сообщение, ответ, и ответ появится непосредственно под выбранным сообщением. При попытке вручную водить эту машину, я хотел воссоздать Нажмите События в простых старых Js.
Я хочу, чтобы иметь возможность нажать и выбирать элемент списка только одним элементом, выбранным за раз. Если я нажму на тот же элемент, он переключает класс между активным и неактивным. Вот что мы будем строить:
Для этого я буду использовать неупорядоченный список лучших пяти лидеров NBA 3-PT (вы можете использовать любой список, который вам нравятся, будь то книги или список фильмов).
Choose a 3-Pt Leader
- Ray Allen | 2973
- Reggie Miller | 2560
- Jason Terry | 2242
- Paul Pierce | 2143
- Kyle Korver | 2097
У меня неупорядоченный список из пяти предметов с классом неактивных. Кроме того, каждый элемент имеет идентификатор данных, который мы будем использовать позже. В наших CSS у нас есть два класса, активные и неактивные. Остальные CSS чисто декоративны:
.active {
background: #cc0000;
color: #fff;
transition: .15s;
}
.inactive {
background: #efefef;
}
Для JS мы сначала хотим схватить неупорядоченный список:
const listOfThings = document.getElementById('list')
Далее мы хотим добавить слушатель события на UL:
const listOfThings = document.getElementById('list')
listOfThings.addEventListener("click", function(event) {})
Внутри слушателя событий мы хотим петлю через все элементы списка:
const listOfThings = document.getElementById('list')
listOfThings.addEventListener("click", function(event) {
let list = document.querySelectorAll('li')
for (let i = 0; i < list.length; i++) {
// loop through all the list items…
}
})
Сначала в цикле для выбранного элемента мы хотим переключить имя класса между активным и неактивным. Мы делаем это, сравнивая идентификатор данных на цели к идентификатору данных о текущей итерации.
const listOfThings = document.getElementById('list')
listOfThings.addEventListener("click", function(event) {
let list = document.querySelectorAll('li')
for (let i = 0; i < list.length; i++) {
if (event.target.dataset.id === list[i].dataset.id) {
if (event.target.className === 'inactive') {
event.target.className = 'active'
} else {
event.target.className = 'inactive'
}
}
}
})
Если мы оставляем это, как есть, мы сможем выбрать более одного элемента за раз. Чтобы предотвратить это, мы добавляем условие остального (если это не цель клика), мы устанавливаем его неактивным. Это гарантирует любой элемент, который не выбран, не имеет красного фона.
const listOfThings = document.getElementById('list')
listOfThings.addEventListener("click", function(event) {
let list = document.querySelectorAll('li')
for (let i = 0; i < list.length; i++) {
if (event.target.dataset.id === list[i].dataset.id) {
if (event.target.className === 'inactive') {
event.target.className = 'active'
} else {
event.target.className = 'inactive'
}
} else {
list[i].className = 'inactive'
}
}
})
Логика становится довольно запутанной, и есть ряд способов написать это, но приведенное выше получает работу. Первоначально у меня была противоположная логика с двумя тройными операторами, разбиты вместе, но это чувствовало себя слишком много:
event.target.dataset.id !== list[i].dataset.id ? list[i].className = 'inactive' : (event.target.className === 'inactive' ? event.target.className = 'active' : event.target.className = 'inactive')
В заключение хорошее упражнение состоит в том, чтобы переписать рамочный код высокого уровня в простой простой JS. Это не только хорошая практика, но это дает нам признательность за рамки, которые мы используем каждый день.
Посмотреть последний продукт здесь http://danielwarren.io/2017/11/26/frameworkensed-events.
Оригинал: “https://dev.to/warrend/frameworkless-events-10i2”