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