1
1
/**
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/
5
6
*/
6
7
( 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 ;
9
14
10
15
$ . event . special . inview = {
11
16
add : function ( data ) {
37
42
}
38
43
} ;
39
44
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
-
68
45
function checkInView ( ) {
46
+ // Fuck IE and its quirks, we're doing this the right way.
69
47
var $elements = $ ( ) , elementsLength , i = 0 ;
70
48
71
49
$ . each ( inviewObjects , function ( i , inviewObject ) {
74
52
$elements = $elements . add ( selector ? $element . find ( selector ) : $element ) ;
75
53
} ) ;
76
54
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 ] ;
85
61
continue ;
86
62
}
87
63
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 ( ) ;
104
67
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 ] ) ;
118
75
}
119
76
} else if ( inView ) {
77
+ // object has left viewport
120
78
$element . data ( 'inview' , false ) . trigger ( 'inview' , [ false ] ) ;
121
79
}
122
80
}
123
81
}
124
82
}
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
- }
136
83
} ) ( jQuery ) ;
0 commit comments