Skip to content

Instantly share code, notes, and snippets.

@a-ignatov-parc
Created December 2, 2013 08:48
Show Gist options
  • Save a-ignatov-parc/7746761 to your computer and use it in GitHub Desktop.
Save a-ignatov-parc/7746761 to your computer and use it in GitHub Desktop.
// Метод реализующий предзагрузку изображений.
// Какие параметры могут обрабатываться в `options`
//
// * `images` - (_DOM/jQuery/falsy_) Ссылка на DOM элемент картинки (`<img/>`) или на `jQuery`
// объект с картинками для которых нужно загрузить изображения.
// Если будет передан null/false/undefined, то изображение будет загружатся не привязываясь к
// какому либо тегу, после чего его можно будет вставить по событию.
//
// * `url` - (_string_) Ссылка на загружаемое изображение. Если этот параметр не передан, то
// должен быть обязательно передан метод `params.getUrl`, который в свою очередь должен возвращать
// ссылку на изобажение иначе загрузка изображения будет отменена.
//
// Список параметров которые могут быт ьперезаны в аргументе `params`:
//
// * `params.getUrl` - (_fn_) Метод, который должен возвращать ссылку на загружаемое изображение для
// текущей картинки.
// Используется если необходимо сделать загрузку множества файлов.
// В качестве аргументов передается ссылка на `jQuery` объект обрабатываемого `<img/>`.
//
// * `params.onStart` - (_fn_) Метод, который вызывается перед началом загрузку изображения.
// Позволяет выполнять внутри анимация из-за чего после выполнения всех действий необходимо
// вызвать функцию `callback`, которая передается в параметрах иначе изображение не будет
// загружатся.
// В качестве аргументов передается ссылка на `jQuery` объект обрабатываемого `<img/>` и
// функция `callback`, которая продолжает операцию по загрузке изображения.
//
// * `params.onLoad` - (_fn_) Метод который вызывается по завершению загрузки изображения.
// В качестве аргументов передается ссылка на `jQuery` объект обрабатываемого `<img/>`.
//
// * `params.onError` - (_fn_) Метод который вызывается если загрузка изображения не удалась.
// В качестве аргументов передается ссылка на `jQuery` объект обрабатываемого `<img/>`.
//
// * `params.forceLoad` - (_bool_) Параметр который указывает на то загружать новое изображение
// если у `DOM` элемента уже проставлен атрибут `src`.
preloadImages: function(images, url, params) {
images = $(images || document.createElement('img'));
params || (params = {});
if (!images.length || (!url && !params.getUrl)) {
return;
}
var self = this,
isPhantom = this.aliases.isPhantomJS,
handler = function() {
var img = $(this).off('.preloader');
if (typeof(params.onLoad) === 'function') {
params.onLoad(img);
}
},
load = function(target, url, handler) {
// Если у изображения уже есть проставленный урл и не передан парамтр для форсированный
// загрузки, то обрываем загрузку
if (target.attr('src') && !params.forceLoad) {
return;
}
// Выставляем изображению урл для загрузки изображения
target.attr('src', url);
// Если изображение загруженно, то сразу вызываем обработчик загрузки.
// Если нет, то навешиваем событие на загрузку изображения.
if (target[0].complete || isPhantom) {
handler.call(target[0], {});
} else {
target
.on('load.preloader', handler)
.on('error.preloader', function() {
var img = $(this).off('.preloader');
if (typeof(params.onError) === 'function') {
params.onError(img);
}
});
}
},
getImg = function(target, url, handler) {
if (typeof(params.onStart) === 'function') {
params.onStart(target, self.bind(function() {
load(this.t, this.u, this.h);
}, {
u: url,
t: target,
h: handler
}));
} else {
load(target, url, handler);
}
};
if (typeof(url) === 'object') {
params = url;
url = null;
}
if (typeof(url) === 'string') {
getImg(images, url, handler);
} else {
if (typeof(params.getUrl) === 'function') {
for (var i = 0, length = images.length, image; i < length; i++) {
image = images.eq(i);
getImg(image, params.getUrl(image), handler);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment