@plotmap/eventmap

A CustomElement class mixin for declarative DOM event handling.

Usage no npm install needed!

<script type="module">
  import plotmapEventmap from 'https://cdn.skypack.dev/@plotmap/eventmap';
</script>

README

EventMap · Build Status

A CustomElement class mixin which supports attaching and detaching DOM events declaratively.

There are two ways to use the mixin. Using decorators or by adding static properties to the class.

Using Decorators

@eventsListenAt("parent")
class MyCass extends EventMap(HTMLElement) {

  @event("event-to-handle-at-parent")
  _someHandler(event) {
    // handle event...
  }

  @event("event-to-handle-at-window", {
    listenAt: "window"
  })
  _anotherHandler(event) {
    // handle event...
  }
}

@eventsListenAt decorator

The eventsListenAt decorator can be used on a class to define where to add event listeners by default.

Possible values

  • self (the default behavior)
  • parent
  • window

@event decorator

Add the event decorator on methods to handle the event.

The decorator takes a second argument to override the default listenAt property.

Using Static Properties

The following example is identical in behavior to the above example using decorators.

class MyCass extends EventMap(HTMLElement) {

  static eventsListenAt = "window";

  static events = {
    "event-to-handle-at-parent": "_someHandler",
    "event-to-handle-at-window": {
      listenAt: "window",
      handler: "_anotherHandler"
    }
  };

  _someHandler(event) {
    // handle event...
  }

  _anotherHandler(event) {
    // handle event...
  }
}

Logging and Middleware

EventMap supports adding middleware to add custom behaviors. You can also use the applyEventMapLogging method to log event information to the console.

Add Logging

import {applyEventMapLogging} from "@plotmap/eventmap/applyEventMapLogging";

applyEventMapLogging();

// or call with collapsed:true to collapse console logging groups
applyEventMapLogging({collapsed:true});

Applying Custom Middleware

import {EventMap} from "@plotmap/eventmap";

EventMap.applyMiddleware(handlerInfo => next => () => {
  // add custom behaviors and call next
  next();
});

Notes on Behavior

Multiple event maps

If any mixin or class uses the EventMap, all subclass and mixin event maps will be merged.

The event maps higher in the chain will take precident.

Event Propagation

When an event handler is matched, stopPropagation() is called on the event before passing it to the handler.