/** * 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).bind("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; }); } }));