Skip to content

Commit

Permalink
update scroll/resize info for scroll/resize start/end
Browse files Browse the repository at this point in the history
  • Loading branch information
hankhsiao committed Aug 30, 2015
1 parent ccd64de commit 20cfc81
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 32 deletions.
19 changes: 11 additions & 8 deletions src/AugmentedEvent.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@
*/
'use strict';

var scroll = {
delta: 0,
top: 0
};
var resize = {
width: 0,
height: 0
};

/**
* ArgmentedEvent will hold some global information, such like window scroll postion,
* so that those information is only calculated once.
Expand All @@ -12,14 +21,8 @@
function ArgmentedEvent(option) {
option = option || {};
this.type = option.type || '';
this.scroll = {
delta: 0,
top: 0
};
this.resize = {
width: 0,
height: 0
};
this.scroll = scroll;
this.resize = resize;
}

module.exports = ArgmentedEvent;
59 changes: 35 additions & 24 deletions src/eventHandlers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,20 @@
'use strict';

var AugmentedEvent = require('../AugmentedEvent');
var doc;
var docBody;
var docEl;
var ee = require('../eventEmitter').eventEmitter;
var leIE8 = require('../lib/leIE8');
var win;

// constants
var EVENT_END_DELAY = 200;

// global variables
var doc;
var docBody;
var docEl;
var enableResizeInfo = false;
var enableScrollInfo = false;
var win;

if (typeof window !== 'undefined' && typeof document !== 'undefined') {
win = window;
doc = document;
Expand All @@ -41,6 +46,23 @@ function copyEventObj(o) {
return r;
}

/**
* Update global scroll/resize info
* @param {Object} ae - The additional event object
* @param {String} eventType - The event type
*/
function updateAdditionalInfo(ae, eventType) {
var top;
if (eventType === 'scroll' && enableScrollInfo) {
top = docEl.scrollTop + docBody.scrollTop;
ae.scroll.delta = top - ae.scroll.top;
ae.scroll.top = top;
} else if (eventType === 'resize' && enableResizeInfo) {
ae.resize.width = win.innerWidth || docEl.clientWidth;
ae.resize.height = win.innerHeight || docEl.clientHeight;
}
}

/**
* Cross-browser addEventListener.
* @method listen
Expand Down Expand Up @@ -83,20 +105,22 @@ function generateEdgeEventHandler(target, eventType, eventStart) {

var throttleRate = options.throttleRate;
var throttle = options.throttleFunc;
var augmentedEvent = new AugmentedEvent({type: eventType + (eventStart ? 'Start' : 'End')});
var ae = new AugmentedEvent({type: eventType + (eventStart ? 'Start' : 'End')});
var timer;

function eventEndCallback(e) {
if (!eventStart) {
ee.emit(eeType, e, augmentedEvent);
updateAdditionalInfo(ae, eventType);
ee.emit(eeType, e, ae);
}
timer = null;
}

function eventHandler(e) {
if (!timer) {
if (eventStart) {
ee.emit(eeType, e, augmentedEvent);
updateAdditionalInfo(ae, eventType);
ee.emit(eeType, e, ae);
}
}

Expand Down Expand Up @@ -128,32 +152,19 @@ function generateEdgeEventHandler(target, eventType, eventStart) {
* @return {Function} The function to generate throttle event.
*/
function generateContinuousEventHandler(target, eventType, noThrottle) {
var enableScrollInfo = false;
var enableResizeInfo = false;

return function(eeType, options) {
if (ee.listeners(eeType, true)) {
return;
}

var throttleRate = options.throttleRate;
var throttle = options.throttleFunc;
var augmentedEvent = new AugmentedEvent({type: eventType});
var ae = new AugmentedEvent({type: eventType});
enableScrollInfo = enableScrollInfo || options.enableScrollInfo;
enableResizeInfo = enableResizeInfo || options.enableResizeInfo;

function eventHandler(e) {
var ae = augmentedEvent;
var top;
if (enableScrollInfo && ae.type === 'scroll') {
top = docEl.scrollTop + docBody.scrollTop;
ae.scroll.delta = top - ae.scroll.top;
ae.scroll.top = top;
}
if (enableResizeInfo && ae.type === 'resize') {
ae.resize.width = win.innerWidth || docEl.clientWidth;
ae.resize.height = win.innerHeight || docEl.clientHeight;
}
updateAdditionalInfo(ae, eventType);
ee.emit(eeType, e, ae);
}

Expand All @@ -169,9 +180,9 @@ function viewportchange(eeType, options) {

var throttleRate = options.throttleRate;
var throttle = options.throttleFunc;
var augmentedEvent = new AugmentedEvent({type: 'viewportchange'});
var ae = new AugmentedEvent({type: 'viewportchange'});
function eventHandler(e) {
ee.emit(eeType, e, augmentedEvent);
ee.emit(eeType, e, ae);
}

var handler = throttleRate > 0 ? throttle(eventHandler, throttleRate) : eventHandler;
Expand Down

0 comments on commit 20cfc81

Please sign in to comment.