react / react-0.13.3 / examples / basic-commonjs / node_modules / react / lib / EnterLeaveEventPlugin.js
81143 views/**1* Copyright 2013-2015, 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 EnterLeaveEventPlugin9* @typechecks static-only10*/1112'use strict';1314var EventConstants = require("./EventConstants");15var EventPropagators = require("./EventPropagators");16var SyntheticMouseEvent = require("./SyntheticMouseEvent");1718var ReactMount = require("./ReactMount");19var keyOf = require("./keyOf");2021var topLevelTypes = EventConstants.topLevelTypes;22var getFirstReactDOM = ReactMount.getFirstReactDOM;2324var eventTypes = {25mouseEnter: {26registrationName: keyOf({onMouseEnter: null}),27dependencies: [28topLevelTypes.topMouseOut,29topLevelTypes.topMouseOver30]31},32mouseLeave: {33registrationName: keyOf({onMouseLeave: null}),34dependencies: [35topLevelTypes.topMouseOut,36topLevelTypes.topMouseOver37]38}39};4041var extractedEvents = [null, null];4243var EnterLeaveEventPlugin = {4445eventTypes: eventTypes,4647/**48* For almost every interaction we care about, there will be both a top-level49* `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that50* we do not extract duplicate events. However, moving the mouse into the51* browser from outside will not fire a `mouseout` event. In this case, we use52* the `mouseover` top-level event.53*54* @param {string} topLevelType Record from `EventConstants`.55* @param {DOMEventTarget} topLevelTarget The listening component root node.56* @param {string} topLevelTargetID ID of `topLevelTarget`.57* @param {object} nativeEvent Native browser event.58* @return {*} An accumulation of synthetic events.59* @see {EventPluginHub.extractEvents}60*/61extractEvents: function(62topLevelType,63topLevelTarget,64topLevelTargetID,65nativeEvent) {66if (topLevelType === topLevelTypes.topMouseOver &&67(nativeEvent.relatedTarget || nativeEvent.fromElement)) {68return null;69}70if (topLevelType !== topLevelTypes.topMouseOut &&71topLevelType !== topLevelTypes.topMouseOver) {72// Must not be a mouse in or mouse out - ignoring.73return null;74}7576var win;77if (topLevelTarget.window === topLevelTarget) {78// `topLevelTarget` is probably a window object.79win = topLevelTarget;80} else {81// TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.82var doc = topLevelTarget.ownerDocument;83if (doc) {84win = doc.defaultView || doc.parentWindow;85} else {86win = window;87}88}8990var from, to;91if (topLevelType === topLevelTypes.topMouseOut) {92from = topLevelTarget;93to =94getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) ||95win;96} else {97from = win;98to = topLevelTarget;99}100101if (from === to) {102// Nothing pertains to our managed components.103return null;104}105106var fromID = from ? ReactMount.getID(from) : '';107var toID = to ? ReactMount.getID(to) : '';108109var leave = SyntheticMouseEvent.getPooled(110eventTypes.mouseLeave,111fromID,112nativeEvent113);114leave.type = 'mouseleave';115leave.target = from;116leave.relatedTarget = to;117118var enter = SyntheticMouseEvent.getPooled(119eventTypes.mouseEnter,120toID,121nativeEvent122);123enter.type = 'mouseenter';124enter.target = to;125enter.relatedTarget = from;126127EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);128129extractedEvents[0] = leave;130extractedEvents[1] = enter;131132return extractedEvents;133}134135};136137module.exports = EnterLeaveEventPlugin;138139140