vendor: 5,231 bytes, lines 1-136
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/ 5 */ 6(function ($) { 7 var inviewObjects = {}, viewportSize, viewportOffset, 8 d = document, w = window, documentElement = d.documentElement, expando = $.expando, timer; 9 10 $.event.special.inview = { 11 add: function(data) { 12 inviewObjects[data.guid + "-" + this[expando]] = { data: data, $element: $(this) }; 13 14 // Use setInterval in order to also make sure this captures elements within 15 // "overflow:scroll" elements or elements that appeared in the dom tree due to 16 // dom manipulation and reflow 17 // old: $(window).scroll(checkInView); 18 // 19 // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays 20 // intervals while the user scrolls. Therefore the inview event might fire a bit late there 21 // 22 // Don't waste cycles with an interval until we get at least one element that 23 // has bound to the inview event. 24 if (!timer && !$.isEmptyObject(inviewObjects)) { 25 timer = setInterval(checkInView, 250); 26 } 27 }, 28 29 remove: function(data) { 30 try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {} 31 32 // Clear interval when we no longer have any elements listening 33 if ($.isEmptyObject(inviewObjects)) { 34 clearInterval(timer); 35 timer = null; 36 } 37 } 38 }; 39 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 function checkInView() { 69 var $elements = $(), elementsLength, i = 0; 70 71 $.each(inviewObjects, function(i, inviewObject) { 72 var selector = inviewObject.data.selector, 73 $element = inviewObject.$element; 74 $elements = $elements.add(selector ? $element.find(selector) : $element); 75 }); 76 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])) { 85 continue; 86 } 87 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 } 104 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]); 118 } 119 } else if (inView) { 120 $element.data('inview', false).trigger('inview', [false]); 121 } 122 } 123 } 124 } 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})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.