Light vanilla event delegation.
Extras
Install from npm and require it in your script.
$ npm install vanilla-delegation --save
require('vanilla-delegation');
or import the script in your html document:
<script rel="https://unpkg.com/vanilla-delegation/dist/vanilla-delegation.min.js" />
The script implements new methods on Element
, NodeList
and HTMLCollection
.
// Add
Element.addDelegateListener(eventType, selector, handler, useCapture = false)
NodeList.addDelegateListener(eventType, selector, handler, useCapture = false)
HTMLCollection.addDelegateListener(eventType, selector, handler, useCapture = false)
// Remove
Element.removeDelegateListener(eventType, selector, handler, useCapture = false)
removeDelegateListener()
if needed. Be aware in case you're using a minifier like uglify-js be sure to set keep_fnames: true
in your uglifyOptions
(more details here)false
). See here for more details.// get single element
const body = document.querySelector('body');
// bind listener with delegation
body.addDelegateListener('click', 'a', function handlerFn(event) {
event.preventDefault();
alert('link clicked!');
});
Also can be used with querySelectorAll
, getElementsByClassName
, getElementsByTagName
, getElementsByTagNameNS
// get multiple elements
const div = document.querySelectorAll('div');
// bind listener with delegation on every element in NodeList (or HTMLCollection)
div.addDelegateListener('click', 'a', function handlerFn(event) {
event.preventDefault();
alert('link clicked!');
});
In order to remove a listener be sure to pass a named function to removeDelegateListener()
const div = document.querySelector('div');
div.removeDelegateListener('click', 'a', handlerFn);
removeDelegateListener()
can be used on single Element nodes only
Event
is passed to handler function as argument.
this
is the element matching selector
.
event.delegateTarget
is the Element to which the event was originally attached (jQuery-like)
A global polyfill is included by default with vanilla-delegation:
See https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill