const START_EVENT_NAME_MAP = { transitionstart: { transition: 'transitionstart', WebkitTransition: 'webkitTransitionStart', MozTransition: 'mozTransitionStart', OTransition: 'oTransitionStart', msTransition: 'MSTransitionStart', }, animationstart: { animation: 'animationstart', WebkitAnimation: 'webkitAnimationStart', MozAnimation: 'mozAnimationStart', OAnimation: 'oAnimationStart', msAnimation: 'MSAnimationStart', }, }; const END_EVENT_NAME_MAP = { transitionend: { transition: 'transitionend', WebkitTransition: 'webkitTransitionEnd', MozTransition: 'mozTransitionEnd', OTransition: 'oTransitionEnd', msTransition: 'MSTransitionEnd', }, animationend: { animation: 'animationend', WebkitAnimation: 'webkitAnimationEnd', MozAnimation: 'mozAnimationEnd', OAnimation: 'oAnimationEnd', msAnimation: 'MSAnimationEnd', }, }; const startEvents = []; const endEvents = []; function detectEvents() { const testEl = document.createElement('div'); const style = testEl.style; if (!('AnimationEvent' in window)) { delete START_EVENT_NAME_MAP.animationstart.animation; delete END_EVENT_NAME_MAP.animationend.animation; } if (!('TransitionEvent' in window)) { delete START_EVENT_NAME_MAP.transitionstart.transition; delete END_EVENT_NAME_MAP.transitionend.transition; } function process(EVENT_NAME_MAP, events) { for (const baseEventName in EVENT_NAME_MAP) { if (EVENT_NAME_MAP.hasOwnProperty(baseEventName)) { const baseEvents = EVENT_NAME_MAP[baseEventName]; for (const styleName in baseEvents) { if (styleName in style) { events.push(baseEvents[styleName]); break; } } } } } process(START_EVENT_NAME_MAP, startEvents); process(END_EVENT_NAME_MAP, endEvents); } if (typeof window !== 'undefined' && typeof document !== 'undefined') { detectEvents(); } function addEventListener(node, eventName, eventListener) { node.addEventListener(eventName, eventListener, false); } function removeEventListener(node, eventName, eventListener) { node.removeEventListener(eventName, eventListener, false); } const TransitionEvents = { // Start events startEvents, addStartEventListener(node, eventListener) { if (startEvents.length === 0) { setTimeout(eventListener, 0); return; } startEvents.forEach(startEvent => { addEventListener(node, startEvent, eventListener); }); }, removeStartEventListener(node, eventListener) { if (startEvents.length === 0) { return; } startEvents.forEach(startEvent => { removeEventListener(node, startEvent, eventListener); }); }, // End events endEvents, addEndEventListener(node, eventListener) { if (endEvents.length === 0) { setTimeout(eventListener, 0); return; } endEvents.forEach(endEvent => { addEventListener(node, endEvent, eventListener); }); }, removeEndEventListener(node, eventListener) { if (endEvents.length === 0) { return; } endEvents.forEach(endEvent => { removeEventListener(node, endEvent, eventListener); }); }, }; export default TransitionEvents;