Last active
March 6, 2017 20:55
-
-
Save patrick-mcdougle/0d72e18f9f52cc586a6c025f7ab6745f to your computer and use it in GitHub Desktop.
Waypoint DOM removal detection
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
... | |
/* Public */ | |
/* http://imakewebthings.com/waypoints/api/context-refresh */ | |
Context.prototype.refresh = function() { | |
/*eslint-disable eqeqeq */ | |
var isWindow = this.element == this.element.window | |
/*eslint-enable eqeqeq */ | |
var contextOffset = isWindow ? undefined : this.adapter.offset() | |
var triggeredGroups = {} | |
var axes | |
this.handleScroll() | |
axes = { | |
horizontal: { | |
contextOffset: isWindow ? 0 : contextOffset.left, | |
contextScroll: isWindow ? 0 : this.oldScroll.x, | |
contextDimension: this.innerWidth(), | |
oldScroll: this.oldScroll.x, | |
forward: 'right', | |
backward: 'left', | |
offsetProp: 'left' | |
}, | |
vertical: { | |
contextOffset: isWindow ? 0 : contextOffset.top, | |
contextScroll: isWindow ? 0 : this.oldScroll.y, | |
contextDimension: this.innerHeight(), | |
oldScroll: this.oldScroll.y, | |
forward: 'down', | |
backward: 'up', | |
offsetProp: 'top' | |
} | |
} | |
for (var axisKey in axes) { | |
var axis = axes[axisKey] | |
for (var waypointKey in this.waypoints[axisKey]) { | |
var waypoint = this.waypoints[axisKey][waypointKey] | |
var adjustment = waypoint.options.offset | |
var oldTriggerPoint = waypoint.triggerPoint | |
var elementOffset = 0 | |
var freshWaypoint = oldTriggerPoint == null | |
var contextModifier, wasBeforeScroll, nowAfterScroll | |
var triggeredBackward, triggeredForward | |
if (waypoint.element.parentNode === null) { | |
delete(this.waypoints[axisKey]); | |
continue; | |
} | |
if (waypoint.element !== waypoint.element.window) { | |
elementOffset = waypoint.adapter.offset()[axis.offsetProp] | |
} | |
if (typeof adjustment === 'function') { | |
adjustment = adjustment.apply(waypoint) | |
} | |
else if (typeof adjustment === 'string') { | |
adjustment = parseFloat(adjustment) | |
if (waypoint.options.offset.indexOf('%') > - 1) { | |
adjustment = Math.ceil(axis.contextDimension * adjustment / 100) | |
} | |
} | |
contextModifier = axis.contextScroll - axis.contextOffset | |
waypoint.triggerPoint = Math.floor(elementOffset + contextModifier - adjustment) | |
wasBeforeScroll = oldTriggerPoint < axis.oldScroll | |
nowAfterScroll = waypoint.triggerPoint >= axis.oldScroll | |
triggeredBackward = wasBeforeScroll && nowAfterScroll | |
triggeredForward = !wasBeforeScroll && !nowAfterScroll | |
if (!freshWaypoint && triggeredBackward) { | |
waypoint.queueTrigger(axis.backward) | |
triggeredGroups[waypoint.group.id] = waypoint.group | |
} | |
else if (!freshWaypoint && triggeredForward) { | |
waypoint.queueTrigger(axis.forward) | |
triggeredGroups[waypoint.group.id] = waypoint.group | |
} | |
else if (freshWaypoint && axis.oldScroll >= waypoint.triggerPoint) { | |
waypoint.queueTrigger(axis.forward) | |
triggeredGroups[waypoint.group.id] = waypoint.group | |
} | |
} | |
} | |
Waypoint.requestAnimationFrame(function() { | |
for (var groupKey in triggeredGroups) { | |
triggeredGroups[groupKey].flushTriggers() | |
} | |
}) | |
return this | |
} | |
... |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment