Skip to content

Commit d0ba8b0

Browse files
committed
bugfix: removing the triggerElement caused problems
Both using Scene.triggerElement(undefined) or removing a triggerElement from the DOM caused problems, which are now resolved. See: janpaepke#307
1 parent dd681a0 commit d0ba8b0

File tree

2 files changed

+31
-22
lines changed

2 files changed

+31
-22
lines changed

dev/src/ScrollMagic/Scene/_static.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var SCENE_OPTIONS = {
2020
val = val || undefined;
2121
if (val) {
2222
var elem = _util.get.elements(val)[0];
23-
if (elem) {
23+
if (elem && elem.parentNode) {
2424
val = elem;
2525
} else {
2626
throw ["Element defined in option \"triggerElement\" was not found:", val];
@@ -81,4 +81,4 @@ ScrollMagic.Scene.extend = function (extension) {
8181
_util.extend(ScrollMagic.Scene, oldClass); // copy properties
8282
ScrollMagic.Scene.prototype = oldClass.prototype; // copy prototype
8383
ScrollMagic.Scene.prototype.constructor = ScrollMagic.Scene; // restore constructor
84-
};
84+
};

dev/src/ScrollMagic/Scene/update-params.js

+29-20
Original file line numberDiff line numberDiff line change
@@ -54,29 +54,38 @@ var updateTriggerElementPosition = function (suppressEvents) {
5454
var
5555
elementPos = 0,
5656
telem = _options.triggerElement;
57-
if (_controller && telem) {
58-
var
59-
controllerInfo = _controller.info(),
60-
containerOffset = _util.get.offset(controllerInfo.container), // container position is needed because element offset is returned in relation to document, not in relation to container.
61-
param = controllerInfo.vertical ? "top" : "left"; // which param is of interest ?
62-
63-
// if parent is spacer, use spacer position instead so correct start position is returned for pinned elements.
64-
while (telem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
65-
telem = telem.parentNode;
66-
}
57+
if (_controller && (telem || _triggerPos > 0)) { // either an element exists or was removed and the triggerPos is still > 0
58+
if (telem) { // there currently a triggerElement set
59+
if (telem.parentNode) { // check if element is still attached to DOM
60+
var
61+
controllerInfo = _controller.info(),
62+
containerOffset = _util.get.offset(controllerInfo.container), // container position is needed because element offset is returned in relation to document, not in relation to container.
63+
param = controllerInfo.vertical ? "top" : "left"; // which param is of interest ?
64+
65+
// if parent is spacer, use spacer position instead so correct start position is returned for pinned elements.
66+
while (telem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
67+
telem = telem.parentNode;
68+
}
69+
70+
var elementOffset = _util.get.offset(telem);
71+
72+
if (!controllerInfo.isDocument) { // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent
73+
containerOffset[param] -= _controller.scrollPos();
74+
}
6775

68-
var elementOffset = _util.get.offset(telem);
76+
elementPos = elementOffset[param] - containerOffset[param];
6977

70-
if (!controllerInfo.isDocument) { // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent
71-
containerOffset[param] -= _controller.scrollPos();
78+
} else { // there was an element, but it was removed from DOM
79+
log(2, "WARNING: triggerElement was removed from DOM and will be reset to", undefined);
80+
Scene.triggerElement(undefined); // unset, so a change event is triggered
81+
}
7282
}
7383

74-
elementPos = elementOffset[param] - containerOffset[param];
75-
}
76-
var changed = elementPos != _triggerPos;
77-
_triggerPos = elementPos;
78-
if (changed && !suppressEvents) {
79-
Scene.trigger("shift", {reason: "triggerElementPosition"});
84+
var changed = elementPos != _triggerPos;
85+
_triggerPos = elementPos;
86+
if (changed && !suppressEvents) {
87+
Scene.trigger("shift", {reason: "triggerElementPosition"});
88+
}
8089
}
8190
};
8291

@@ -88,4 +97,4 @@ var onContainerResize = function (e) {
8897
if (_options.triggerHook > 0) {
8998
Scene.trigger("shift", {reason: "containerResize"});
9099
}
91-
};
100+
};

0 commit comments

Comments
 (0)