react / react-0.13.3 / examples / basic-commonjs / node_modules / reactify / node_modules / react-tools / src / addons / transitions / ReactTransitionEvents.js
81155 views/**1* Copyright 2013-2014, Facebook, Inc.2* All rights reserved.3*4* This source code is licensed under the BSD-style license found in the5* LICENSE file in the root directory of this source tree. An additional grant6* of patent rights can be found in the PATENTS file in the same directory.7*8* @providesModule ReactTransitionEvents9*/1011"use strict";1213var ExecutionEnvironment = require('ExecutionEnvironment');1415/**16* EVENT_NAME_MAP is used to determine which event fired when a17* transition/animation ends, based on the style property used to18* define that event.19*/20var EVENT_NAME_MAP = {21transitionend: {22'transition': 'transitionend',23'WebkitTransition': 'webkitTransitionEnd',24'MozTransition': 'mozTransitionEnd',25'OTransition': 'oTransitionEnd',26'msTransition': 'MSTransitionEnd'27},2829animationend: {30'animation': 'animationend',31'WebkitAnimation': 'webkitAnimationEnd',32'MozAnimation': 'mozAnimationEnd',33'OAnimation': 'oAnimationEnd',34'msAnimation': 'MSAnimationEnd'35}36};3738var endEvents = [];3940function detectEvents() {41var testEl = document.createElement('div');42var style = testEl.style;4344// On some platforms, in particular some releases of Android 4.x,45// the un-prefixed "animation" and "transition" properties are defined on the46// style object but the events that fire will still be prefixed, so we need47// to check if the un-prefixed events are useable, and if not remove them48// from the map49if (!('AnimationEvent' in window)) {50delete EVENT_NAME_MAP.animationend.animation;51}5253if (!('TransitionEvent' in window)) {54delete EVENT_NAME_MAP.transitionend.transition;55}5657for (var baseEventName in EVENT_NAME_MAP) {58var baseEvents = EVENT_NAME_MAP[baseEventName];59for (var styleName in baseEvents) {60if (styleName in style) {61endEvents.push(baseEvents[styleName]);62break;63}64}65}66}6768if (ExecutionEnvironment.canUseDOM) {69detectEvents();70}7172// We use the raw {add|remove}EventListener() call because EventListener73// does not know how to remove event listeners and we really should74// clean up. Also, these events are not triggered in older browsers75// so we should be A-OK here.7677function addEventListener(node, eventName, eventListener) {78node.addEventListener(eventName, eventListener, false);79}8081function removeEventListener(node, eventName, eventListener) {82node.removeEventListener(eventName, eventListener, false);83}8485var ReactTransitionEvents = {86addEndEventListener: function(node, eventListener) {87if (endEvents.length === 0) {88// If CSS transitions are not supported, trigger an "end animation"89// event immediately.90window.setTimeout(eventListener, 0);91return;92}93endEvents.forEach(function(endEvent) {94addEventListener(node, endEvent, eventListener);95});96},9798removeEndEventListener: function(node, eventListener) {99if (endEvents.length === 0) {100return;101}102endEvents.forEach(function(endEvent) {103removeEventListener(node, endEvent, eventListener);104});105}106};107108module.exports = ReactTransitionEvents;109110111