Alex Chueng's blogs
©2021 Alex Chueng's blogs
JS 自定义 DOM 事件
7 min read
# 翻译# 记录# 前端

最近找到了关于自定义 HTML DOM 的事件的方法,分享一下。本人比较懒,不翻译了。 NOTE : 低版本的 IE < 8 不支持

简单的用法就是,但是有缺陷就是运行时需要有 DOM

function handleEvent(e) {

// obj 可以是 document 、 window 或者 element
obj.addEventListener("eventName", handleEvent);

var customerEvent = new CustomEvent("eventName", {
  detail: {
    state: 'ok'


Creating custom events Events can be created with the Event constructor as follows:

var event = new Event('build');// Listen for the event.elem.addEventListener('build', function (e) { ... }, false);// Dispatch the event.elem.dispatchEvent(event);

This constructor is supported in most modern browsers (with Internet Explorer being the exception). For a more verbose approach, see the old-fashioned way below.

Adding custom data – CustomEvent() To add more data to the event object, the CustomEvent interface exists and the detail property can be used to pass custom data. For example, the event could be created as follows:

var event = new CustomEvent('build', { 'detail': elem.dataset.time });

This will then allow you to access the additional data in the event listener:

function eventHandler(e) {
  log('The time is: ' + e.detail);

The old-fashioned way The older approach to creating events uses APIs inspired by Java. The following shows an example:

// Create the event.var event = document.createEvent('Event');// Define that the event name is 'build'.event.initEvent('build', true, true);// Listen for the event.document.addEventListener('build', function (e) {
  // matches document from above}, false);// target can be any Element or other EventTarget.document.dispatchEvent(event);

Triggering built-in events This example demonstrates simulating a click (that is programmatically generating a click event) on a checkbox using DOM methods. View the example in action.

function simulateClick() {
  var event = new MouseEvent('click', {
    'view': window,
    'bubbles': true,
    'cancelable': true
  var cb = document.getElementById('checkbox'); 
  var canceled = !cb.dispatchEvent(event);
  if (canceled) {
    // A handler called preventDefault.    alert("canceled");
  } else {
    // None of the handlers called preventDefault.    alert("not canceled");