люди предпочитают связывать событие с родительским элементом
Это упоминается как делегирование события и особенно полезно, когда вы хотите запустить один и тот же обработчик событий для нескольких элементов. Вместо привязки обработчика события к каждому из этих элементов, вы привязываете его к общему предку, а затем проверяете, из какого элемента произошло событие. Это работает, потому что события всплывают в DOM-дереве .
Интересно, что лучше?
Это зависит, оба подхода имеют свои плюсы и минусы.
Делегирование события может быть медленнее, так как событие должно всплыть первым. Вам также может потребоваться выполнить обход DOM, поскольку событие может не возникать в элементе, для которого вы проверяете. Например, в вашем примере элементы li
могут иметь других дочерних элементов, скажем, элемент a
. Чтобы выяснить, является ли выбранный элемент a
потомком одного из li
s, вы должны пройти через предков и проверить их.
С другой стороны, непосредственное связывание обработчика происходит быстрее в том смысле, что событие обрабатывается непосредственно в элементе. Но если вы связываете много обработчиков событий и не делаете это должным образом (как в вашем примере), вы используете больше памяти, чем вам действительно нужно. Старые браузеры (я думаю, особенно IE) также могут работать хуже, если есть много обработчиков событий.
Кроме того, иногда, когда обрабатывают эффект перетаскивания, люди всегда связывают событие mousemove со всем документом, почему?
Проблема в том, что при перетаскивании элемента мышь часто перемещается на быстрее , чем элемент, и покидает его. Если вы связываете событие mousemove
только с перетаскиваемым элементом, всякий раз, когда курсор покидает элемент, движение останавливается. Чтобы избежать этого, обработчик событий привязан ко всему документу (на время перетаскивания), чтобы движение было плавным.