- return this.each(function() {
- var self = this;
- /* TODO: use .data() instead of .attr() */
- $(self).attr("original", $(self).attr("src"));
- if ("scroll" != settings.event
- || $.belowthefold(self, settings)
- || $.rightoffold(self, settings)) {
- if (settings.placeholder) {
- $(self).attr("src", settings.placeholder);
- } else {
- $(self).removeAttr("src");
- }
- self.loaded = false;
- } else {
- self.loaded = true;
- }
-
- /* When appear is triggered load original image. */
- $(self).one("appear", function() {
- if (!this.loaded) {
- $("<img />")
- .bind("load", function() {
- $(self)
- .hide()
- .attr("src", $(self).attr("original"))
- [settings.effect](settings.effectspeed);
- self.loaded = true;
- })
- .attr("src", $(self).attr("original"));
- };
- });
-
- /* When wanted event is triggered load original image */
- /* by triggering appear. */
- if ("scroll" != settings.event) {
- $(self).bind(settings.event, function(event) {
- if (!self.loaded) {
- $(self).trigger("appear");
+ function belowViewport(container, element, threshold) {
+ return $(container).offset().top + $(container).height() + threshold <= $(element).offset().top;
+ }
+
+ function checkScroll() {
+ if (Math.abs(container.scrollTop() - container.data('lastScroll')) > settings.scrollThreshold) {
+ container.data('lastScroll', container.scrollTop());
+
+ $(pattern, container).each(function() {
+ if (aboveViewport(container, this, settings.threshold)
+ || belowViewport(container, this, settings.threshold)) {
+ $(this).html(settings.placeholder);
+ } else {
+ $(this).html('<img src="' + $(this).attr('src') + '" width="' + $(this).width() + '" />');