17 марта 2020 г.
"Ежедневная серия вопросов 🚀"
Автор: Ван Эргоу
Блог:Наггетс,думаю нет,Знай почти,короткая книга,CSDN
Ставьте лайк и смотрите снова, сформируйте привычку, ежедневная серия вопросов будет постоянно обновляться, ваша поддержка - самая большая мотивация для меня продолжать делиться 😘
чтобы понятьDOM
Связанные события, мы должны сначала понять“事件流”
Понятие «поток событий» описывает порядок, в котором события поступают со страницы.
Всплывание событий: события изначально принимаются наиболее конкретным элементом, а затем распространяются вверх по иерархии к менее конкретным узлам или документам.
Захват событий: события сначала принимаются менее специфическими узлами, а затем распространяются на наиболее специфичные узлы. Это противоположность пузырьковым событиям.
DOM2
Поток событий, определяемый событием уровня, включает в себя три этапа: захват события, целевой этап и всплывающее окно событий.
делегация мероприятия
Делегирование событий, с точки зрения непрофессионала, заключается в делегировании события элемента его родительскому элементу или элементу более высокого уровня для обработки.Его механизм реализации — всплытие событий.
Предположим, что есть список, который требует нажатия на элемент списка, чтобы открыть соответствующее поле:
<ul id="myLink">
<li id="1">aaa</li>
<li id="2">bbb</li>
<li id="3">ccc</li>
</ul>
Не используйте делегирование событий
var myLink = document.getElementById('myLink');
var li = myLink.getElementsByTagName('li');
for(var i = 0; i < li.length; i++) {
li[i].onclick = function(e) {
var e = event || window.event;
var target = e.target || e.srcElement;
alert(e.target.id + ':' + e.target.innerText);
};
}
Существует проблема:
- Привязывать события к каждому списку, потребляя память
- При наличии динамически добавляемых элементов необходимо повторно привязывать события к элементам
Делегат события, написанный интерфейсом 8k
На самом деле способ делегирования события, который многие студенты видят в интернете, неправильный.Хотя он и неправильный, вы можете пройти его во время собеседования, потому что встречающий вас интервьюер может не знать, как правильно написать делегирование события.
Давайте посмотрим, как пишется неправильная версия делегата события:
ul.addEventListener('click', function(e){
if(e.target.tagName.toLowerCase() === 'li'){
fn() // 执行某个函数
}
})
20 000 делегаций событий, написанных внешним интерфейсом
Неправильная версия делегированного событияbug
это если пользователь нажметli
внутриspan
, это не сработаетfn
, что явно неверно.
Тогда давайте посмотрим, как должно быть написано правильное делегирование события:
function delegate(element, eventType, selector, fn) {
element.addEventListener(eventType, e => {
let el = e.target
while (!el.matches(selector)) {
if (element === el) {
el = null
break
}
el = el.parentNode
}
el && fn.call(el, e, el)
})
return element
}
Идея состоит в том, чтобы нажатьspan
Затем рекурсивно пройтиspan
Элемент предка, чтобы увидеть, что нетul
внутриli
.
Преимущества делегирования мероприятия
- Вам нужно только делегировать события одного и того же элемента родительскому элементу или элементам более высокого уровня, и вам не нужно привязывать события ко всем элементам, уменьшая объем памяти и повышая производительность.
- Динамически добавляемые элементы не требуют повторной привязки событий.
Пункты к сведению
- Реализация делегирования событий основана на всплывающей подсказке, поэтому события, не поддерживающие всплывающую подсказку, не подходят для делегирования событий.
- Не все привязки событий подходят для использования делегирования событий, и неправильное использование может привести к тому, что элементы, которые не нужно привязывать к событиям, будут привязаны к событиям.
Напомните себе, что независимо от того, насколько вы устали, не забывайте учиться.Нет короткого пути к успеху, только один шаг за другим. взаимное поощрение!
Если в статье что-то не так, поправьте меня.
Спасибо всем~ 💘