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) {
 | 
						|
      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;
 |