What is propagating-hammerjs?
The `propagating-hammerjs` package is a wrapper around the popular `hammer.js` library, which is used for handling touch gestures in web applications. This wrapper adds event propagation capabilities to `hammer.js`, allowing touch events to bubble up through the DOM, similar to how native DOM events work.
What are propagating-hammerjs's main functionalities?
Basic Gesture Handling
This feature allows you to handle basic touch gestures like pan, pinch, rotate, etc., on a specific DOM element. The events will propagate up the DOM tree, allowing for more flexible event handling.
const Hammer = require('hammerjs');
const PropagatingHammer = require('propagating-hammerjs');
const element = document.getElementById('myElement');
const hammer = PropagatingHammer(new Hammer(element));
hammer.on('pan', function(event) {
console.log('Pan gesture detected:', event);
});
Event Propagation
This feature demonstrates how touch events can propagate from child elements to parent elements. In this example, both the parent and child elements can handle the 'tap' gesture, and the event will bubble up from the child to the parent.
const Hammer = require('hammerjs');
const PropagatingHammer = require('propagating-hammerjs');
const parentElement = document.getElementById('parentElement');
const childElement = document.getElementById('childElement');
const parentHammer = PropagatingHammer(new Hammer(parentElement));
const childHammer = PropagatingHammer(new Hammer(childElement));
parentHammer.on('tap', function(event) {
console.log('Tap gesture detected on parent:', event);
});
childHammer.on('tap', function(event) {
console.log('Tap gesture detected on child:', event);
});
Custom Gesture Recognition
This feature allows you to define custom gestures. In this example, a custom 'doubletap' gesture is created and added to the Hammer instance. The event will propagate through the DOM as expected.
const Hammer = require('hammerjs');
const PropagatingHammer = require('propagating-hammerjs');
const element = document.getElementById('myElement');
const hammer = PropagatingHammer(new Hammer(element));
const customRecognizer = new Hammer.Tap({ event: 'doubletap', taps: 2 });
hammer.add(customRecognizer);
hammer.on('doubletap', function(event) {
console.log('Double tap gesture detected:', event);
});
Other packages similar to propagating-hammerjs
hammerjs
Hammer.js is a popular library for handling touch gestures in web applications. It provides a wide range of gesture recognizers and is highly customizable. However, it does not support event propagation out of the box, which is where `propagating-hammerjs` adds value.
interactjs
Interact.js is a powerful library for handling drag-and-drop, resizing, and multi-touch gestures. It offers more advanced features compared to `propagating-hammerjs`, such as inertia and snapping, but it does not focus on event propagation.
alloyfinger
AlloyFinger is a lightweight library for handling touch gestures. It is similar to Hammer.js but is smaller in size and has a simpler API. Like Hammer.js, it does not support event propagation natively.
propagating-hammerjs
Extend hammer.js (v2) with event propagation.
We use the @egjs/hammerjs fork because hammer.js is not maintained anymore.
Features
- Events emitted by hammer will propagate in order from child to parent
elements.
- Events are extended with a function
event.stopPropagation()
to stop
propagation to parent elements. - Events are extended with a property
event.firstTarget
containing the
element where a gesture started. - Supports changing and rearranging the HTML DOM on the fly.
- Load via commonjs, AMD, or as a plain old JavaScript file.
Install
npm install @egjs/hammerjs propagating-hammerjs
Load
Browser
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/@egjs/hammerjs@latest/dist/hammer.js"></script>
<script src="https://unpkg.com/propagating-hammerjs@latest/propagating.js"></script>
<script>
function init() {
var hammer = propagating(new Hammer(element));
}
</script>
</head>
<body>
</body>
</html>
Commonjs (e.g. Node.js, Browserify)
var Hammer = require('@egjs/hammerjs');
var propagating = require('propagating-hammerjs');
function init() {
var hammer = propagating(new Hammer(element));
}
ESM (e.g. ES6, typescript)
import Hammer from '@egjs/hammerjs';
import propagating from 'propagating-hammerjs';
function init() {
const hammer = propagating(new Hammer(element));
}
Use
To extend individual hammer.js instances with event propagation:
var hammer = propagating(new Hammer(element));
To extend the global hammer.js constructor
Hammer = propagating(Hammer);
Examples
Here a basic usage example.
More examples are available in the folder /examples.
<!DOCTYPE html>
<html>
<head>
<script src="node_modules/@egjs/hammerjs/dist/hammer.js"></script>
<script src="node_muludes/propagating-hammerjs/propagating.js"></script>
<style>
div {border: 1px solid black;}
#parent {width: 400px; height: 400px; background: lightgreen;}
#child {width: 200px; height: 200px; background: yellow; margin: 10px;}
</style>
</head>
<body>
<div id="parent">
parent
<div id="child">
child
</div>
</div>
<script>
var parent = document.getElementById('parent');
var hammer1 = propagating(new Hammer(parent))
.on('tap', function (event) {
alert('tap on parent');
});
var child = document.getElementById('child');
var hammer2 = propagating(new Hammer(child))
.on('tap', function (event) {
alert('tap on child');
event.stopPropagation();
});
</script>
</body>
</html>
API
Construction:
propagating(hammer: Hammer.Manager, options?: {
preventDefault?: true | 'mouse' | 'touch' | 'pen'
}): Hammer.Manager
parameters
returns
Returns the same hammer instance with extended functionality.
events
The emitted hammer.js events are
extended with:
-
event.stopPropagation()
If called, the event will not further propagate the elements parents.
-
event.firstTarget
Contains the HTML element where a gesture started (where as event.target
contains the element where the pointer is right now).
Develop
To generate the UMD bundle for commonjs and browser, run:
npm run build
License
MIT