# Add and Remove Listeners
ready() {
super.ready();
this.addEventListener('click', e => this._myClickListener(e));
}
The previous example uses an arrow function to ensure the listener is called with the element as the this value. You can also use bind to create a bound instance of the listener function. This can be useful if you need to remove the listener.
constructor() {
super();
this._boundListener = this._myLocationListener.bind(this);
}
connectedCallback() {
super.connectedCallback();
window.addEventListener('hashchange', this._boundListener);
}
disconnectedCallback() {
super.disconnectedCallback();
window.removeEventListener('hashchange', this._boundListener);
}
# Fire custom events
To fire a custom event from the host element use the standard CustomEvent constructor and the dispatchEvent method.
x-custom.js
class XCustom extends PolymerElement {
static get template(){
return html`
`;
}
handleClick(e) {
this.dispatchEvent(new CustomEvent('kick', {detail: {kicked: true}}));
}
}
customElements.define('x-custom', XCustom);
index.html
To make a custom event pass through shadow DOM boundaries, set the composed flag to true when you create the event:
var event = new CustomEvent('my-event', {bubbles: true, composed: true});
# Handle Retargeted events
The event's composedPath() method returns an array of nodes through which the event will pass. So event.composedPath()[0] represents the original target for the event (unless that target is hidden in a closed shadow root).
event-retargeting.js
class EventRetargeting extends PolymerElement {
static get template(){
return html`
`;
}
ready() {
super.ready();
this.$.myButton.addEventListener('click', e => {this._handleClick(e)});
}
_handleClick(e) {
console.info(e.target.id + ' was clicked.');
}
}
customElements.define('event-retargeting', EventRetargeting);
index.html
# Using gesture event
Gesture events require some extra setup, so you can't simply add a listener using the generic addEventListener method. To listen for a gesture event:
Use an annotated event listener for one of the gesture events.
Tap here!
## Gesture event types
The following are the gesture event types supported, with a short description and list of detail properties available on event.detail for each type:
1 . down—finger/button went down
x—clientX coordinate for event
y—clientY coordinate for event
sourceEvent—the original DOM event that caused the down action
2 . up—finger/button went up
x—clientX coordinate for event
y—clientY coordinate for event
sourceEvent—the original DOM event that caused the up action
3 . tap—down & up occurred
x—clientX coordinate for event
y—clientY coordinate for event
sourceEvent—the original DOM event that caused the tap action
4 . track—moving while finger/button is down
1. state—a string indicating the tracking state:
2. start—fired when tracking is first detected (finger/button down and moved past a pre-set distance threshold)
track—fired while tracking
3. end—fired when tracking ends
x—clientX coordinate for event
y—clientY coordinate for event
dx—change in pixels horizontally since the first track event
dy—change in pixels vertically since the first track event
ddx—change in pixels horizontally since last track event
ddy—change in pixels vertically since last track event
hover()—a function that may be called to determine the element currently being hovered
Example,
class DragMe extends GestureEventListeners(PolymerElement){
static get template(){
return html`
[[message]]
`;
}
handleTrack(e) {
switch(e.detail.state) {
case 'start':
this.message = 'Tracking started!';
break;
case 'track':
this.message = 'Tracking in progress... ' +
e.detail.x + ', ' + e.detail.y;
break;
case 'end':
this.message = 'Tracking ended!';
break;
}
}
}
#### Example imperative event listener
import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
import * as Gestures from '@polymer/polymer/lib/utils/gestures.js';
class TapMe extends GestureEventListeners(PolymerElement){
static get template(){
return html`
Tap me!
I've been tapped [[count]] times.
`;
}
constructor() {
super();
this.count = 0;
Gestures.addListener(this, 'tap', this.handleTap.bind(this));
}
handleTap(e) {
this.count++;
}
}
customElements.define('tap-me', TapMe);
## Gestures and scroll direction
Listening for certain gestures controls the scrolling direction for touch input. For example, nodes with a listener for the track event will prevent scrolling by default. Elements can override scroll direction with this.setScrollDirection(direction, node), where direction is one of 'x', 'y', 'none', or 'all', and node defaults to this.