|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(function($) { |
|
$.fn.appear = function(fn, options) { |
|
|
|
var settings = $.extend({ |
|
|
|
|
|
data: undefined, |
|
|
|
|
|
one: true, |
|
|
|
|
|
accX: 0, |
|
accY: 0 |
|
|
|
}, options); |
|
|
|
return this.each(function() { |
|
|
|
var t = $(this); |
|
|
|
|
|
t.appeared = false; |
|
|
|
if (!fn) { |
|
|
|
|
|
t.trigger('appear', settings.data); |
|
return; |
|
} |
|
|
|
var w = $(window); |
|
|
|
|
|
var check = function() { |
|
|
|
|
|
if (!t.is(':visible')) { |
|
|
|
|
|
t.appeared = false; |
|
return; |
|
} |
|
|
|
|
|
var a = w.scrollLeft(); |
|
var b = w.scrollTop(); |
|
var o = t.offset(); |
|
var x = o.left; |
|
var y = o.top; |
|
|
|
var ax = settings.accX; |
|
var ay = settings.accY; |
|
var th = t.height(); |
|
var wh = w.height(); |
|
var tw = t.width(); |
|
var ww = w.width(); |
|
|
|
if (y + th + ay >= b && |
|
y <= b + wh + ay && |
|
x + tw + ax >= a && |
|
x <= a + ww + ax) { |
|
|
|
|
|
if (!t.appeared) t.trigger('appear', settings.data); |
|
|
|
} else { |
|
|
|
|
|
t.appeared = false; |
|
} |
|
}; |
|
|
|
|
|
var modifiedFn = function() { |
|
|
|
|
|
t.appeared = true; |
|
|
|
|
|
if (settings.one) { |
|
|
|
|
|
w.unbind('scroll', check); |
|
var i = $.inArray(check, $.fn.appear.checks); |
|
if (i >= 0) $.fn.appear.checks.splice(i, 1); |
|
} |
|
|
|
|
|
fn.apply(this, arguments); |
|
}; |
|
|
|
|
|
if (settings.one) t.one('appear', settings.data, modifiedFn); |
|
else t.bind('appear', settings.data, modifiedFn); |
|
|
|
|
|
w.scroll(check); |
|
|
|
|
|
$.fn.appear.checks.push(check); |
|
|
|
|
|
(check)(); |
|
}); |
|
}; |
|
|
|
|
|
$.extend($.fn.appear, { |
|
|
|
checks: [], |
|
timeout: null, |
|
|
|
|
|
checkAll: function() { |
|
var length = $.fn.appear.checks.length; |
|
if (length > 0) while (length--) ($.fn.appear.checks[length])(); |
|
}, |
|
|
|
|
|
run: function() { |
|
if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout); |
|
$.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20); |
|
} |
|
}); |
|
|
|
|
|
$.each(['append', 'prepend', 'after', 'before', 'attr', |
|
'removeAttr', 'addClass', 'removeClass', 'toggleClass', |
|
'remove', 'css', 'show', 'hide'], function(i, n) { |
|
var old = $.fn[n]; |
|
if (old) { |
|
$.fn[n] = function() { |
|
var r = old.apply(this, arguments); |
|
$.fn.appear.run(); |
|
return r; |
|
} |
|
} |
|
}); |
|
|
|
})(jQuery); |