/** * author Christopher Blum * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/ * - forked from http://github.com/zuk/jquery.inview/ */ (function (factory) { if (typeof define == 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // Node, CommonJS module.exports = factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var inviewObjects = [], viewportSize, viewportOffset, d = document, w = window, documentElement = d.documentElement, timer; $.event.special.inview = { add: function(data) { inviewObjects.push({ data: data, $element: $(this), element: this }); // Use setInterval in order to also make sure this captures elements within // "overflow:scroll" elements or elements that appeared in the dom tree due to // dom manipulation and reflow // old: $(window).scroll(checkInView); // // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays // intervals while the user scrolls. Therefore the inview event might fire a bit late there // // Don't waste cycles with an interval until we get at least one element that // has bound to the inview event. if (!timer && inviewObjects.length) { timer = setInterval(checkInView, 250); } }, remove: function(data) { for (var i=0; i viewportOffset.top && elementOffset.top < viewportOffset.top + viewportSize.height && elementOffset.left + elementSize.width > viewportOffset.left && elementOffset.left < viewportOffset.left + viewportSize.width) { if (!inView) { $element.data('inview', true).trigger('inview', [true]); } } else if (inView) { $element.data('inview', false).trigger('inview', [false]); } } } $(w).on("scroll resize scrollstop", function() { viewportSize = viewportOffset = null; }); // IE < 9 scrolls to focused elements without firing the "scroll" event if (!documentElement.addEventListener && documentElement.attachEvent) { documentElement.attachEvent("onfocusin", function() { viewportOffset = null; }); } }));