Spaces:
Runtime error
Runtime error
/*! | |
* jQuery imagesLoaded plugin v2.1.0 | |
* http://github.com/desandro/imagesloaded | |
* | |
* MIT License. by Paul Irish et al. | |
*/ | |
/*jshint curly: true, eqeqeq: true, noempty: true, strict: true, undef: true, browser: true */ | |
/*global jQuery: false */ | |
;(function($, undefined) { | |
; | |
// blank image data-uri bypasses webkit log warning (thx doug jones) | |
var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=='; | |
$.fn.imagesLoaded = function( callback ) { | |
var $this = this, | |
deferred = $.isFunction($.Deferred) ? $.Deferred() : 0, | |
hasNotify = $.isFunction(deferred.notify), | |
$images = $this.find('img').add( $this.filter('img') ), | |
loaded = [], | |
proper = [], | |
broken = []; | |
// Register deferred callbacks | |
if ($.isPlainObject(callback)) { | |
$.each(callback, function (key, value) { | |
if (key === 'callback') { | |
callback = value; | |
} else if (deferred) { | |
deferred[key](value); | |
} | |
}); | |
} | |
function doneLoading() { | |
var $proper = $(proper), | |
$broken = $(broken); | |
if ( deferred ) { | |
if ( broken.length ) { | |
deferred.reject( $images, $proper, $broken ); | |
} else { | |
deferred.resolve( $images ); | |
} | |
} | |
if ( $.isFunction( callback ) ) { | |
callback.call( $this, $images, $proper, $broken ); | |
} | |
} | |
function imgLoaded( img, isBroken ) { | |
// don't proceed if BLANK image, or image is already loaded | |
if ( img.src === BLANK || $.inArray( img, loaded ) !== -1 ) { | |
return; | |
} | |
// store element in loaded images array | |
loaded.push( img ); | |
// keep track of broken and properly loaded images | |
if ( isBroken ) { | |
broken.push( img ); | |
} else { | |
proper.push( img ); | |
} | |
// cache image and its state for future calls | |
$.data( img, 'imagesLoaded', { isBroken: isBroken, src: img.src } ); | |
// trigger deferred progress method if present | |
if ( hasNotify ) { | |
deferred.notifyWith( $(img), [ isBroken, $images, $(proper), $(broken) ] ); | |
} | |
// call doneLoading and clean listeners if all images are loaded | |
if ( $images.length === loaded.length ){ | |
setTimeout( doneLoading ); | |
$images.unbind( '.imagesLoaded' ); | |
} | |
} | |
// if no images, trigger immediately | |
if ( !$images.length ) { | |
doneLoading(); | |
} else { | |
$images.bind( 'load.imagesLoaded error.imagesLoaded', function( event ){ | |
// trigger imgLoaded | |
imgLoaded( event.target, event.type === 'error' ); | |
}).each( function( i, el ) { | |
var src = el.src; | |
// find out if this image has been already checked for status | |
// if it was, and src has not changed, call imgLoaded on it | |
var cached = $.data( el, 'imagesLoaded' ); | |
if ( cached && cached.src === src ) { | |
imgLoaded( el, cached.isBroken ); | |
return; | |
} | |
// if complete is true and browser supports natural sizes, try | |
// to check for image status manually | |
if ( el.complete && el.naturalWidth !== undefined ) { | |
imgLoaded( el, el.naturalWidth === 0 || el.naturalHeight === 0 ); | |
return; | |
} | |
// cached images don't fire load sometimes, so we reset src, but only when | |
// dealing with IE, or image is complete (loaded) and failed manual check | |
// webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f | |
if ( el.readyState || el.complete ) { | |
el.src = BLANK; | |
el.src = src; | |
} | |
}); | |
} | |
return deferred ? deferred.promise( $this ) : $this; | |
}; | |
})(jQuery); |