event.target

  1. event.target —— 是引发事件的目标元素,它在冒泡过程中不会发生变化。。
  2. this —— current 元素,其中有一个当前正在运行的处理器。

停止冒泡:

  1. event.stopPropagation() // 单个处理器
  2. event.stopImmediatePropagation() 全部处理器

捕获

DOM 事件标准描述了事件传播的 3 个阶段:

  1. 捕获阶段 —— 事件(从 Window)向下到达元素上。
  2. 目标阶段 —— 事件到达目标元素。
  3. 冒泡阶段 —— 事件从元素上开始冒泡。

image.png
即:对于 的单击,事件首先通过祖先链向下传递到元素(捕获),然后到达目标,最后上升(冒泡),在途中调用处理器。

要在捕获阶段捕获事件,我们需要将 *addEventListener 的第三个参数设置为 true**。

  • 如果为 false(默认值),则在冒泡阶段设置处理器。
  • 如果为 true,则在捕获阶段设置处理器。

事件委托

在处理器中,我们可以得到 event.target,查看事件实际发生的位置并处理它。

浏览器默认动作

  • mousedown —— 开始选择(移动鼠标进行选择)。
  • <input type="checkbox">click —— 检查/取消选中的 input
  • submit —— 单击 <input type="submit"> 或在表单中通过单击 Enter 触发该事件,并在其后浏览器提交表单。
  • wheel —— 鼠标滚轮事件的滚动将作为默认动作。
  • keydown —— 按下按键可能会导致将字符添加到字段,或者触发其他动作。
  • contextmenu —— 事件发生在右击时,动作是显示浏览器上下文菜单。

想要阻止默认行为 —— 可以使用 event.preventDefault() 或者 return false。第二个方法只适用于分发了 on<event>的处理器。
如果默认动作被阻止,event.defaultPrevented 的值就会变成 true,否则会变成 false

组合键: shift、alt、ctrl 和 meta:

  1. button.onclick = function(event) {
  2. if (event.altKey && event.shiftKey) {
  3. alert('Hooray!');
  4. }
  5. };

获取按钮:which:

有三个可能的值:

  • event.which == 1 —— 左按钮
  • event.which == 2 —— 中间按钮
  • event.which == 3 —— 右按钮

如果我们想要禁用选择以保护内容不被复制粘贴,那么我们可以使用另一个事件:oncopy

移动:mouseover/out,mouseenter/leave

拖放鼠标事件

  1. ball.onmousedown = function(event) {
  2. let shiftX = event.clientX - ball.getBoundingClientRect().left;
  3. let shiftY = event.clientY - ball.getBoundingClientRect().top;
  4. ball.style.position = 'absolute';
  5. ball.style.zIndex = 1000;
  6. document.body.append(ball);
  7. moveAt(event.pageX, event.pageY);
  8. // 球中心在 (pageX, pageY) 坐标上
  9. function moveAt(pageX, pageY) {
  10. ball.style.left = pageX - shiftX + 'px';
  11. ball.style.top = pageY - shiftY + 'px';
  12. }
  13. function onMouseMove(event) {
  14. moveAt(event.pageX, event.pageY);
  15. }
  16. // (3) 用 mousemove 移动球
  17. document.addEventListener('mousemove', onMouseMove);
  18. // (4) 释放球,移除不需要的处理器
  19. ball.onmouseup = function() {
  20. document.removeEventListener('mousemove', onMouseMove);
  21. ball.onmouseup = null;
  22. };
  23. };
  24. ball.ondragstart = function() {
  25. return false;
  26. };

focusblur 事件是不会向上冒泡的。

focusinfocusout 事件可以使用 — 恰好和 focus/blur 事件很像,只不过它们会向上冒泡。
值得注意的是它们必须使用 elem.addEventListener 来指定,而不是 on<event>

  1. form.addEventListener("focusin", () => form.classList.add('focused'));
  2. form.addEventListener("focusout", () => form.classList.remove('focused'));