事件与事件捕获
1. DOM事件
《JS高程》上说,触发事件分为三个阶段:事件捕获、到达目标节点、事件冒泡。然而经测试,发现在事件捕获阶段包含到达目标节点。
关于DOM事件触发的顺序,分为三个阶段:事件捕获、到达目标阶段、事件冒泡
事件捕获:从window=>document=>html=>body=>…=>目标节点的父节点
到达目标阶段:如果事件类型是不可冒泡型,则完成当前阶段后事件对象会停止
事件冒泡:从目标节点的父节点=>…=>body=>html=>document=>window
不会冒泡的事件有:focus、blur、mouseenter、mouseleave
2. stopPropagation
event.stopPropagation: 无论在捕获还是冒泡阶段都能停止事件对象。
event.stopImmediatePropagation:阻止事件冒泡并且阻止相同事件的其他侦听器被调用。
除了这个区别,我在使用chrome浏览器测试时发现,如果在目标对象的捕获阶段进行event.stopPropagation,则还是会冒泡到目标对象的冒泡阶段。
如果在目标对象的捕获阶段进行event.stopImmediatePropagation,则不会冒泡到目标对象的冒泡阶段。
3. mouseover、mouseenter、mousemove、mouseout、mouseleave的执行顺序
mouseover=>mouseenter=>mousemove=>mouseout=>mouseleave
mouseover事件是当鼠标位于一个元素外部,用户将鼠标首次移入另一个元素边界之内时触发。
mouseenter事件是鼠标从元素外部首次移动到元素之内时触发。
mouseout事件是鼠标从一个元素,被用户移入另一个元素时触发。
mouseleave事件是位于元素上方的鼠标移动到元素范围之外时触发。
mouseout和mouseover事件都会先于mouseenter和mouseleave事件,并且mouseout和mouseover事件都会在这种情况下触发:一个父元素内有一个子元素,将鼠标从父元素移动到子元素时,会触发父元素的mouseout事件和子元素的mouseover事件。
4. mouseup、mousedown、click和focus的顺序
mousedown=>focus=>mouseup=>click
5. DOMContentLoaded、load和jquery.onload的执行点
window的load事件会在页面中的一切都加载完毕时触发,但这个过程可能会因为要加载的外部资源过多而颇费周折。DOMContentLoaded是在完全加载和解析完HTML文档后执行,无需等待样式表、图片、脚本的加载。
6. 事件委托
事件委托利用了事件冒泡,在父元素上指定一个事件处理程序,管理某一类的所有事件
事件委托的好处:我们需要创建和存储在内存中的事件处理函数变少,在父节点上进行事件委托,那么如果删除或添加一个子节点,就不需要再添加或删除事件监听器。在内存中留有过时不用的“空事件处理程序”,也会造成Web应用程序内存与性能问题。
优势:
节省内存占用,减少事件注册
新增子对象时无需再次对其绑定事件,适合动态添加元素