Skip to content

Dispatch Event

自定义事件只能使用 addEventListener。

js
new Event("type", {
  bubbles: false, // true,会冒泡
  cancelable: false, // true,“默认行为”会被阻止
});

type 可以是任意字符串

js
elem.dispatchEvent(event);

dispatch 发起的事件,event.isTrusted 是 true

例:

js
document.addEventListener("hello", function (event) {
  alert("Hello from " + event.target.tagName); // Hello from H1
});

let event = new Event("hello", { bubbles: true }); // (2)
elem.dispatchEvent(event);

如果你想使用 MouseEvent ,那就就应该 new MouseEvent 而不是 new Event

MouseEvent 有些属性,Event 并没有!

Custom Event

从技术上讲,CustomEvent 和 Event 一样

但是 CustomEvent 还支持一个附加的属性 detail

js
new CustomEvent("hello", {
  detail: { name: "qins" },
});

Custom Event 的 event.preventDefault()

自定义事件是没有 “默认行为” 的。

所以 自定义事件的 event.preventDefault() 有其他用。

js
rabbit.addEventListener("hide", function (event) {
  //(1)
  event.preventDefault();
});

const event = new CustomEvent("hide", {
  cancelable: true, // 没有这个标志,preventDefault 将不起作用
});

//(1)是否 event.preventDefault() 会体现在 result 上
// 为true 就使用了 event.preventDefault()
const result = rabbit.dispatchEvent(event);

事件队列

通常 Event 是在队列中处理的。

即使 一个一个来:mousedown -> mousemove -> mouseup。

但是 一个 Event 是在另一个 Event 中发起的,会立刻执行。如 dispatchEvent

js
menu.onclick = function () {
  alert(1);

  menu.dispatchEvent(
    new CustomEvent("menu-open", {
      bubbles: true,
    })
  );

  alert(2);
};

document.addEventListener("menu-open", () => alert("nested"));

顺序为:1 → nested → 2

要避免这种情况,使用 setTimeout 0

js
setTimeout(() =>
  menu.dispatchEvent(
    new CustomEvent("menu-open", {
      bubbles: true,
    })
  )
);

此时顺序为:1 → 2 → nested