1/* 2 * jQuery appear plugin 3 * 4 * Copyright (c) 2012 Andrey Sidorov 5 * licensed under MIT license. 6 * 7 * https://github.com/morr/jquery.appear/ 8 * 9 * Version: 0.3.6 10 */ 11(function($) { 12 var selectors = []; 13 14 var check_binded = false; 15 var check_lock = false; 16 var defaults = { 17 interval: 250, 18 force_process: false 19 }; 20 var $window = $(window); 21 22 var $prior_appeared = []; 23 24 function appeared(selector) { 25 return $(selector).filter(function() { 26 return $(this).is(':appeared'); 27 }); 28 } 29 30 function process() { 31 check_lock = false; 32 for (var index = 0, selectorsLength = selectors.length; index < selectorsLength; index++) { 33 var $appeared = appeared(selectors[index]); 34 35 $appeared.trigger('appear', [$appeared]); 36 37 if ($prior_appeared[index]) { 38 var $disappeared = $prior_appeared[index].not($appeared); 39 $disappeared.trigger('disappear', [$disappeared]); 40 } 41 $prior_appeared[index] = $appeared; 42 } 43 } 44 45 function add_selector(selector) { 46 selectors.push(selector); 47 $prior_appeared.push(); 48 } 49 50 // "appeared" custom filter 51 $.expr[':'].appeared = function(element) { 52 var $element = $(element); 53 if (!$element.is(':visible')) { 54 return false; 55 } 56 57 var window_left = $window.scrollLeft(); 58 var window_top = $window.scrollTop(); 59 var offset = $element.offset(); 60 var left = offset.left; 61 var top = offset.top; 62 63 if (top + $element.height() >= window_top && 64 top - ($element.data('appear-top-offset') || 0) <= window_top + $window.height() && 65 left + $element.width() >= window_left && 66 left - ($element.data('appear-left-offset') || 0) <= window_left + $window.width()) { 67 return true; 68 } else { 69 return false; 70 } 71 }; 72 73 $.fn.extend({ 74 // watching for element's appearance in browser viewport 75 appear: function(options) { 76 var opts = $.extend({}, defaults, options || {}); 77 var selector = this.selector || this; 78 if (!check_binded) { 79 var on_check = function() { 80 if (check_lock) { 81 return; 82 } 83 check_lock = true; 84 85 setTimeout(process, opts.interval); 86 }; 87 88 $(window).scroll(on_check).resize(on_check); 89 check_binded = true; 90 } 91 92 if (opts.force_process) { 93 setTimeout(process, opts.interval); 94 } 95 add_selector(selector); 96 return $(selector); 97 } 98 }); 99 100 $.extend({ 101 // force elements's appearance check 102 force_appear: function() { 103 if (check_binded) { 104 process(); 105 return true; 106 } 107 return false; 108 } 109 }); 110})(function() { 111 if (typeof module !== 'undefined') { 112 // Node 113 return require('jquery'); 114 } else { 115 return jQuery; 116 } 117}());
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.