123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- (function($, window, document) {
- var ImageLazyload = $.Lazyload.extend({
- init: function(element, options) {
- this._super(element, options);
- },
- _init: function() {
- this.options.selector = '[data-lazyload]';
- this._super();
- },
- _set: function(element, uri) {
- if (element.tagName === 'IMG') {
- element.src = uri;
- } else {
- element.style.backgroundImage = "url(" + uri + ")";
- }
- },
- _hasPlaceholder: function(element) {
- if (element.offsetWidth) {
- if (element.tagName === 'IMG') {
- return !!element.src;
- } else {
- return !!element.style.backgroundImage;
- }
- }
- return false;
- },
- _addPlaceHolder: function(element) {
- var self = this;
- if (element.tagName === 'IMG') {
- self._counter++;
- element.onload = function() {
- self._counter--;
- self.addCallback(element, self.handle);
- this.onload = null;
- };
- self.onPlaceHolder(function(placeholder) {
- self._set(element, placeholder);
- });
- } else {
- element.style.backgroundImage = "url(" + self.options.placeholder + ")";
- }
- },
- addElement: function(element) {
- var self = this;
- var uri = element.getAttribute('data-lazyload');
- if (uri) {
- if (self._hasPlaceholder(element)) {
- self.addCallback(element, self.handle);
- } else {
- self.onPlaceHolder = self._createLoader(function(callback) {
- var img = new Image();
- var placeholder = self.options.placeholder;
- img.src = placeholder;
- img.onload = img.onerror = function() {
- callback(placeholder);
- };
- });
- self._addPlaceHolder(element);
- }
- return true;
- }
- return false;
- },
- set: function(element, uri) {
- var self = this;
- var img = new Image();
- img.onload = function() {
- self._set(element, uri);
- $.trigger(self.element, 'success', {
- element: element,
- uri: uri
- });
- };
- img.onerror = function() {
- $.trigger(self.element, 'error', {
- element: element,
- uri: uri
- });
- };
- img.src = uri;
- element.removeAttribute('data-lazyload'); //只尝试一次,后续可能支持多次尝试
- },
- handle: function(element, key) {
- var uri = element.getAttribute('data-lazyload');
- if (uri) {
- this.set(element, uri);
- //element.parentNode.parentNode.setAttribute('data-lazyload', 'true'); //debug
- }
- },
- destroy: function() {
- this._super();
- this.element.removeAttribute('data-imageLazyload');
- }
- });
- $.fn.imageLazyload = function(options) {
- var lazyloadApis = [];
- this.each(function() {
- var self = this;
- var lazyloadApi = null;
- if (self === document || self === window) {
- self = document.body;
- }
- var id = self.getAttribute('data-imageLazyload');
- if (!id) {
- id = ++$.uuid;
- $.data[id] = lazyloadApi = new ImageLazyload(self, options);
- self.setAttribute('data-imageLazyload', id);
- } else {
- lazyloadApi = $.data[id];
- }
- lazyloadApis.push(lazyloadApi);
- });
- return lazyloadApis.length === 1 ? lazyloadApis[0] : lazyloadApis;
- }
- })(mui, window, document);
|