vendor: 2,440 bytes, lines 1-76
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; 9 10 $.event.special.inview = { 11 add: function(data) { 12 inviewObjects[data.guid + "-" + this[expando]] = { data: data, $element: $(this) }; 13 }, 14 15 remove: function(data) { 16 try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {} 17 } 18 }; 19 20 function getViewportSize() { 21 var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth }; 22 23 // if this is correct then return it. iPad has compat Mode, so will 24 // go into check clientHeight/clientWidth (which has the wrong value). 25 if (!size.height) { 26 mode = d.compatMode; 27 if (mode || !$.support.boxModel) { // IE, Gecko 28 domObject = mode === 'CSS1Compat' ? 29 documentElement : // Standards 30 d.body; // Quirks 31 size = { 32 height: domObject.clientHeight, 33 width: domObject.clientWidth 34 }; 35 } 36 } 37 38 return size; 39 } 40 41 function getViewportOffset() { 42 return { 43 top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop, 44 left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft 45 }; 46 } 47 48 function checkInView() { 49 var $elements = $(), elementsLength, i = 0; 50 51 $.each(inviewObjects, function(i, inviewObject) { 52 var selector = inviewObject.data.selector, 53 $element = inviewObject.$element; 54 $elements = $elements.add(selector ? $element.find(selector) : $element); 55 }); 56 57 elementsLength = $elements.length; 58 if (elementsLength) { 59 viewportSize = viewportSize || getViewportSize(); 60 viewportOffset = viewportOffset || getViewportOffset(); 61 62 for (; i<elementsLength; i++) { 63 // Ignore elements that are not in the DOM tree 64 if (!$.contains(documentElement, $elements[i])) { 65 continue; 66 } 67 68 var element = $elements[i], 69 $element = $(element), 70 elementSize = {}, 71 elementOffset = {}, 72 inView = $element.data('inview'), 73 visiblePartX, 74 visiblePartY, 75 visiblePartsMerged; 76
77 // for the case where 'display:none' is used in place of 'visibility:hidden' 78 // count and sum the above items to get and move closer to the correct values 79 // IMPORTANT :: insert element into container empty 80 if($element.css('display') == 'none') 81 { 82 var parentElement = $element.parent(); 83 84 elementOffset.top = parentElement.offset().top; 85 elementOffset.left = parentElement.offset().left; 86 elementSize.height = parentElement.height(); 87 elementSize.width = parentElement.width(); 88 } else { 89 elementSize = { height: $element.height(), width: $element.width() } 90 elementOffset = $element.offset(); 91 } 92 93 // Don't ask me why because I haven't figured out yet: 94 // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5. 95 // Even though it sounds weird: 96 // It seems that the execution of this function is interferred by the onresize/onscroll event 97 // where viewportOffset and viewportSize are unset 98 if (!viewportOffset || !viewportSize) { 99 return; 100 } 101 102 if (element.offsetWidth >= 0 && element.offsetHeight >= 0 && element.style.display != "none" && 103 elementOffset.top + elementSize.height > viewportOffset.top && 104 elementOffset.top < viewportOffset.top + viewportSize.height && 105 elementOffset.left + elementSize.width > viewportOffset.left && 106 elementOffset.left < viewportOffset.left + viewportSize.width) { 107 visiblePartX = (viewportOffset.left > elementOffset.left ? 108 'right' : (viewportOffset.left + viewportSize.width) < (elementOffset.left + elementSize.width) ? 109 'left' : 'both'); 110 visiblePartY = (viewportOffset.top > elementOffset.top ? 111 'bottom' : (viewportOffset.top + viewportSize.height) < (elementOffset.top + elementSize.height) ? 112 'top' : 'both'); 113 visiblePartsMerged = visiblePartX + "-" + visiblePartY; 114 if (!inView || inView !== visiblePartsMerged) { 115 $element.data('inview', visiblePartsMerged).trigger('inview', [true, visiblePartX, visiblePartY]); 116 } 117 } else if (inView) { 118 $element.data('inview', false).trigger('inview', [false]); 119 } 120 } 121 } 122 } 123 124 $(w).bind("scroll resize", function() { 125 viewportSize = viewportOffset = null; 126 }); 127 128 // IE < 9 scrolls to focused elements without firing the "scroll" event 129 if (!documentElement.addEventListener && documentElement.attachEvent) { 130 documentElement.attachEvent("onfocusin", function() { 131 viewportOffset = null; 132 }); 133 } 134 135 // Use setInterval in order to also make sure this captures elements within 136 // "overflow:scroll" elements or elements that appeared in the dom tree due to 137 // dom manipulation and reflow 138 // old: $(window).scroll(checkInView); 139 // 140 // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays 141 // intervals while the user scrolls. Therefore the inview event might fire a bit late there 142 setInterval(checkInView, 250); 143})(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.