Events
Handle timepicker events using EventEmitter API or callbacks
EventEmitter API (Recommended)
The new EventEmitter API provides a clean, type-safe way to handle events:
on(event, handler)
Subscribe to an event. Handler is called every time the event fires.
1const picker = new TimepickerUI(input);2picker.create();34picker.on('confirm', (data) => {5 console.log('Time confirmed:', data);6});
once(event, handler)
Subscribe to an event that fires only once.
1picker.once('open', () => {2 console.log('Opened for the first time');3});
off(event, handler)
Unsubscribe from an event.
1const handler = (data) => console.log(data);2picker.on('confirm', handler);3picker.off('confirm', handler);
Available Events
All events you can subscribe to. These events work in both clock (default) and wheel mode. A few additional events (range:get-disabled-time, range:update-disabled, range:minute:commit) are internal coordination events and not part of the public contract.
confirm
Triggered when user confirms time selection.
1picker.on('confirm', (data) => {2 console.log('Hour:', data.hour);3 console.log('Minutes:', data.minutes);4 console.log('Type:', data.type); // 'AM' or 'PM' (12h mode)5 console.log('Auto commit:', data.autoCommit);6 // autoCommit is true when the confirm was triggered7 // by wheel.commitOnScroll instead of the OK button8});
cancel
Triggered when user cancels or closes picker. The payload is empty.
1picker.on('cancel', () => {2 console.log('Cancelled');3});
open
Triggered when picker opens.
1picker.on('open', (data) => {2 console.log('Picker opened');3 console.log(data.hour, data.minutes, data.type);4 console.log(data.degreesHours, data.degreesMinutes);5});
show
Triggered when the modal becomes visible. Empty payload.
1picker.on('show', () => {2 console.log('Modal shown');3});
hide
Triggered when the modal is hidden. Empty payload.
1picker.on('hide', () => {2 console.log('Modal hidden');3});
update
Triggered when time value changes during interaction.
1picker.on('update', (data) => {2 console.log('Time updated:', data.hour, data.minutes);3 console.log('Type:', data.type); // 'AM' or 'PM' (12h mode)4});
select:hour
Triggered when hour is selected.
1picker.on('select:hour', (data) => {2 console.log('Hour selected:', data.hour);3});
select:minute
Triggered when minute is selected.
1picker.on('select:minute', (data) => {2 console.log('Minute selected:', data.minutes);3});
select:am
Triggered when AM is selected (12h mode only).
1picker.on('select:am', (data) => {2 console.log('AM selected');3});
select:pm
Triggered when PM is selected (12h mode only).
1picker.on('select:pm', (data) => {2 console.log('PM selected');3});
switch:view
Triggered when switching between clock and keyboard view. Empty payload.
1picker.on('switch:view', () => {2 console.log('View switched');3});
error
Triggered when validation error occurs.
1picker.on('error', (data) => {2 console.error('Error:', data.error);3 console.log('Rejected:', data.rejectedHour, data.rejectedMinute);4 console.log('Input values:', data.inputHour, data.inputMinute);5 console.log('Input type/length:', data.inputType, data.inputLength);6});
clear
Triggered when user clicks the clear button.
1picker.on('clear', (data) => {2 console.log('Time cleared. Previous value:', data.previousValue);3});
timezone:change
Triggered when the timezone is changed (timezone plugin only).
1picker.on('timezone:change', (data) => {2 console.log('Timezone:', data.timezone);3});
range:confirm
Triggered when a time range is confirmed (range mode only).
1picker.on('range:confirm', (data) => {2 console.log('From:', data.from, 'To:', data.to);3 console.log('Duration (minutes):', data.duration);4});
range:switch
Triggered when switching between the from/to segments (range mode only).
1picker.on('range:switch', (data) => {2 console.log('Active segment:', data.active); // 'from' | 'to'3 console.log('Disabled time:', data.disabledTime);4});
range:validation
Triggered when the range duration is validated (range mode only).
1picker.on('range:validation', (data) => {2 console.log('Valid:', data.valid, 'Duration:', data.duration);3 console.log('Limits:', data.minDuration, data.maxDuration);4});
animation:clock / animation:start / animation:end
Animation coordination events fired around open/close and clock transitions. Empty payloads.
1picker.on('animation:start', () => console.log('Animation started'));2picker.on('animation:end', () => console.log('Animation finished'));3picker.on('animation:clock', () => console.log('Clock animation'));
wheel:scroll:start
Triggered when a wheel column starts scrolling (wheel mode only).
1picker.on('wheel:scroll:start', (data) => {2 console.log('Scroll started on column:', data.column);3 // data.column: 'hours' | 'minutes' | 'ampm'4});
wheel:scroll:end
Triggered when a wheel column finishes scrolling and snaps to a value (wheel mode only).
1picker.on('wheel:scroll:end', (data) => {2 console.log('Column:', data.column, 'snapped to:', data.value);3 console.log('Previous value:', data.previousValue);4 // data.column: 'hours' | 'minutes' | 'ampm'5});
Callback Options (Alternative)
You can also use callback options in the constructor:
onConfirm
Alternative: pass callback in options.
1new TimepickerUI(input, {2 callbacks: {3 onConfirm: (data) => {4 console.log('Confirmed:', data);5 }6 }7});
onCancel
Triggered when user cancels.
1new TimepickerUI(input, {2 callbacks: {3 onCancel: (data) => {4 console.log('Cancelled');5 }6 }7});
onOpen
Triggered when picker opens.
1new TimepickerUI(input, {2 callbacks: {3 onOpen: () => {4 console.log('Opened');5 }6 }7});
onUpdate
Triggered during time changes.
1new TimepickerUI(input, {2 callbacks: {3 onUpdate: (data) => {4 console.log('Updated:', data);5 }6 }7});
onSelectHour
Triggered when hour is selected.
1new TimepickerUI(input, {2 callbacks: {3 onSelectHour: (data) => {4 console.log('Hour:', data.hour);5 }6 }7});
onSelectMinute
Triggered when minute is selected.
1new TimepickerUI(input, {2 callbacks: {3 onSelectMinute: (data) => {4 console.log('Minute:', data.minutes);5 }6 }7});
onSelectAM
Triggered when AM is selected.
1new TimepickerUI(input, {2 callbacks: {3 onSelectAM: () => {4 console.log('AM selected');5 }6 }7});
onSelectPM
Triggered when PM is selected.
1new TimepickerUI(input, {2 callbacks: {3 onSelectPM: () => {4 console.log('PM selected');5 }6 }7});
onError
Triggered on validation error.
1new TimepickerUI(input, {2 callbacks: {3 onError: (data) => {4 console.error('Error:', data.error);5 }6 }7});
onTimezoneChange
Triggered when timezone is changed (timezone plugin only).
1new TimepickerUI(input, {2 callbacks: {3 onTimezoneChange: (data) => {4 console.log('Timezone:', data.timezone);5 }6 }7});
onRangeConfirm
Triggered when a range is confirmed (range mode only).
1new TimepickerUI(input, {2 callbacks: {3 onRangeConfirm: (data) => {4 console.log('Range:', data.from, '-', data.to, data.duration);5 }6 }7});
onRangeSwitch
Triggered when switching between from/to segments (range mode only).
1new TimepickerUI(input, {2 callbacks: {3 onRangeSwitch: (data) => {4 console.log('Active segment:', data.active);5 }6 }7});
onRangeValidation
Triggered on range validation (range mode only).
1new TimepickerUI(input, {2 callbacks: {3 onRangeValidation: (data) => {4 console.log('Valid:', data.valid, 'Duration:', data.duration);5 }6 }7});
onClear
Triggered when user clicks the clear button.
1new TimepickerUI(input, {2 callbacks: {3 onClear: (data) => {4 console.log('Cleared:', data.previousValue);5 }6 }7});
Legacy DOM Events (Removed)
Removed in v4.0.0
DOM events (e.g., timepicker:confirm) have been removed in v4.0.0. If you're upgrading from v3.x, you must migrate to the EventEmitter API.
The EventEmitter API provides better type safety, error handling, and performance.
1// REMOVED in v4.0.02input.addEventListener('timepicker:confirm', (e) => {3 console.log(e.detail);4});56// CORRECT - use the EventEmitter API instead7picker.on('confirm', (data) => {8 console.log(data);9});
Event Data
Every event has its own payload type, exported from timepicker-ui. The most important ones:
1type OpenEventData = {2 hour: string;3 minutes: string;4 type?: string; // 'AM' or 'PM' (12h mode)5 degreesHours: number | null;6 degreesMinutes: number | null;7};89type ConfirmEventData = {10 hour?: string;11 minutes?: string;12 type?: string;13 autoCommit?: boolean; // true when triggered by wheel.commitOnScroll14};1516type UpdateEventData = {17 hour?: string;18 minutes?: string;19 type?: string;20};2122type CancelEventData = Record<string, never>; // empty payload2324type ClearEventData = {25 previousValue: string | null;26};2728type ErrorEventData = {29 error: string;30 rejectedHour?: string;31 rejectedMinute?: string;32 inputHour?: string | number;33 inputMinute?: string | number;34 inputType?: string;35 inputLength?: string | number;36};3738// Also exported: SelectHourEventData, SelectMinuteEventData,39// SelectAMEventData, SelectPMEventData, ShowEventData, HideEventData,40// SwitchViewEventData, TimezoneChangeEventData, RangeConfirmEventData,41// RangeSwitchEventData, RangeValidationEventData,42// WheelScrollStartEventData, WheelScrollEndEventData
Complete Example
1const picker = new TimepickerUI(input, {2 ui: { theme: 'dark' },3 clock: { type: '12h' }4});5picker.create();67// EventEmitter API (recommended)8picker.on('confirm', (data) => {9 console.log('Time confirmed:', data.hour, data.minutes, data.type);10 fetch('/api/save-time', {11 method: 'POST',12 body: JSON.stringify(data)13 });14});1516picker.on('cancel', () => {17 console.log('User cancelled');18});1920picker.on('update', (data) => {21 document.getElementById('display').textContent =22 `${data.hour}:${data.minutes} ${data.type || ''}`;23});2425picker.on('select:hour', (data) => {26 console.log('Hour selected:', data.hour);27});2829picker.on('select:minute', (data) => {30 console.log('Minute selected:', data.minutes);31});3233picker.on('error', (data) => {34 console.error('Validation error:', data.error);35});3637// One-time event38picker.once('open', () => {39 console.log('Picker opened for the first time');40});4142// Remove event listener43const updateHandler = (data) => console.log(data);44picker.on('update', updateHandler);45picker.off('update', updateHandler);