Skip to content

Commit 64d9c0d

Browse files
author
Matthew Frey
committed
Initial edits - removed support for really old browsers and made in view checks more modern
1 parent b2a2681 commit 64d9c0d

File tree

2 files changed

+35
-84
lines changed

2 files changed

+35
-84
lines changed

jquery.inview.js

Lines changed: 28 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
/**
2-
* author Christopher Blum
3-
* - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/
4-
* - forked from http://github.com/zuk/jquery.inview/
2+
* Jquery Inview 2
3+
* Version: 0.1
4+
* Author: Matthew Frey (mmmeff)
5+
* - forked from http://github.com/protonet/jquery.inview/
56
*/
67
(function ($) {
7-
var inviewObjects = {}, viewportSize, viewportOffset,
8-
d = document, w = window, documentElement = d.documentElement, expando = $.expando, timer;
8+
var inviewObjects = {},
9+
d = document,
10+
w = window,
11+
documentElement = d.documentElement,
12+
expando = $.expando,
13+
timer;
914

1015
$.event.special.inview = {
1116
add: function(data) {
@@ -37,35 +42,8 @@
3742
}
3843
};
3944

40-
function getViewportSize() {
41-
var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth };
42-
43-
// if this is correct then return it. iPad has compat Mode, so will
44-
// go into check clientHeight/clientWidth (which has the wrong value).
45-
if (!size.height) {
46-
mode = d.compatMode;
47-
if (mode || !$.support.boxModel) { // IE, Gecko
48-
domObject = mode === 'CSS1Compat' ?
49-
documentElement : // Standards
50-
d.body; // Quirks
51-
size = {
52-
height: domObject.clientHeight,
53-
width: domObject.clientWidth
54-
};
55-
}
56-
}
57-
58-
return size;
59-
}
60-
61-
function getViewportOffset() {
62-
return {
63-
top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop,
64-
left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft
65-
};
66-
}
67-
6845
function checkInView() {
46+
// Fuck IE and its quirks, we're doing this the right way.
6947
var $elements = $(), elementsLength, i = 0;
7048

7149
$.each(inviewObjects, function(i, inviewObject) {
@@ -74,63 +52,32 @@
7452
$elements = $elements.add(selector ? $element.find(selector) : $element);
7553
});
7654

77-
elementsLength = $elements.length;
78-
if (elementsLength) {
79-
viewportSize = viewportSize || getViewportSize();
80-
viewportOffset = viewportOffset || getViewportOffset();
81-
82-
for (; i<elementsLength; i++) {
83-
// Ignore elements that are not in the DOM tree
84-
if (!$.contains(documentElement, $elements[i])) {
55+
if (elements.length) {
56+
for (var i = 0; i < $elements.length; i++) {
57+
if (!$elements[i]) {
58+
continue;
59+
} else if (!$.contains(documentElement, $elements[i])) {
60+
delete $elements[i];
8561
continue;
8662
}
8763

88-
var $element = $($elements[i]),
89-
elementSize = { height: $element.height(), width: $element.width() },
90-
elementOffset = $element.offset(),
91-
inView = $element.data('inview'),
92-
visiblePartX,
93-
visiblePartY,
94-
visiblePartsMerged;
95-
96-
// Don't ask me why because I haven't figured out yet:
97-
// viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
98-
// Even though it sounds weird:
99-
// It seems that the execution of this function is interferred by the onresize/onscroll event
100-
// where viewportOffset and viewportSize are unset
101-
if (!viewportOffset || !viewportSize) {
102-
return;
103-
}
64+
var el = $elements[i],
65+
inView = el.data('inview'),
66+
rect = el.getBoundingClientRect();
10467

105-
if (elementOffset.top + elementSize.height > viewportOffset.top &&
106-
elementOffset.top < viewportOffset.top + viewportSize.height &&
107-
elementOffset.left + elementSize.width > viewportOffset.left &&
108-
elementOffset.left < viewportOffset.left + viewportSize.width) {
109-
visiblePartX = (viewportOffset.left > elementOffset.left ?
110-
'right' : (viewportOffset.left + viewportSize.width) < (elementOffset.left + elementSize.width) ?
111-
'left' : 'both');
112-
visiblePartY = (viewportOffset.top > elementOffset.top ?
113-
'bottom' : (viewportOffset.top + viewportSize.height) < (elementOffset.top + elementSize.height) ?
114-
'top' : 'both');
115-
visiblePartsMerged = visiblePartX + "-" + visiblePartY;
116-
if (!inView || inView !== visiblePartsMerged) {
117-
$element.data('inview', visiblePartsMerged).trigger('inview', [true, visiblePartX, visiblePartY]);
68+
if (rect.top >= 0 &&
69+
rect.left >= 0 &&
70+
rect.bottom <= (w.innerHeight || documentElement.clientHeight) &&
71+
rect.right <= (w.innerWidth || documentElement.clientWidth)) {
72+
if (!inView) {
73+
// object has entered viewport
74+
$element.data('inview', true).trigger('inview', [true]);
11875
}
11976
} else if (inView) {
77+
// object has left viewport
12078
$element.data('inview', false).trigger('inview', [false]);
12179
}
12280
}
12381
}
12482
}
125-
126-
$(w).bind("scroll resize", function() {
127-
viewportSize = viewportOffset = null;
128-
});
129-
130-
// IE < 9 scrolls to focused elements without firing the "scroll" event
131-
if (!documentElement.addEventListener && documentElement.attachEvent) {
132-
documentElement.attachEvent("onfocusin", function() {
133-
viewportOffset = null;
134-
});
135-
}
13683
})(jQuery);

jquery.inview.min.js

Lines changed: 7 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)