131 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 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) {
 | |
|       window.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) {
 | |
|       window.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;
 |