Так как JavaScript занимаюсь всего месяц, я еще не очень освоил детали. Нужно разъяснение по работе кода. А именно - что происходит в каждой строчке кода:
function preloadImages() {
if (typeof arguments[arguments.length - 1] == 'function') {
var callback = arguments[arguments.length - 1];
} else {
var callback = false;
}
if (typeof arguments[0] == 'object') {
var images = arguments[0];
var n = images.length;
} else {
var images = arguments;
var n = images.length - 1;
}
var not_loaded = n;
for (var i = 0; i < n; i++) {
jQuery(new Image()).attr('src', images[i]).load(function() {
if (--not_loaded < 1 && typeof callback == 'function') {
callback();
}
});
}
}
Комментарии к коду:
function preloadImages() {
//
//Смотрим была ли передана функция callback последним параметром
//preloadImages(function(){})
//
if (typeof arguments[arguments.length - 1] == 'function') {
var callback = arguments[arguments.length - 1];
} else {
var callback = false;
}
//
//Проверяем как были переданы пути картинок
//массивом: preloadImages(["a.jpg", "b.jpg"])
//или через запятую: preloadImages("a.jpg", "b.jpg")
//
if (typeof arguments[0] == 'object') {
var images = arguments[0];
var n = images.length;
} else {
var images = arguments;
var n = images.length - 1;
}
var not_loaded = n;
//
//Создаем новый объект класса Image
//Устанавливаем поле src - путь к картинке
//Подписываемся на событие load
//Если была задана callback-функция, вызываем ее
//
for (var i = 0; i < n; i++) {
jQuery(new Image()).attr('src', images[i]).load(function() {
if (--not_loaded < 1 && typeof callback == 'function') {
callback();
}
});
}
}
Можно сделать проще и красивее:
function preload(sources)
{
var images = [];
for (i = 0, length = sources.length; i < length; ++i) {
images[i] = new Image();
images[i].src = sources[i];
}
}
или
$.fn.preload = function() {
this.each(function(){
$('<img/>')[0].src = this;
});
}
Взято отсюда тут и тут.
Это имитация перегрузки функции:
preloadImages([url1, url2, ...]);
preloadImages([url1, url2, ...], callback);
preloadImages(url1, url2, ..., callback);
// preloadImages(url1, url2, ...); // Потеряли из-за бага
Сама функция загружает все картинки и вызывает коллбек, если он был предоставлен.
callback
. Иначе коллбека нет.images
- массив с изображениями.preloadImages(url1, url2, ..., callback)
и вытаскиваем images
как все arguments
кроме последнего. Не совсем так, но такое поведение эмулируется за счёт использования n вместо длины. Это баг! Нельзя передать поштучно адреса, не передав коллбек - последний адрес потеряется.not_loaded
- число картинок, которые осталось загрузить.PS: Функция не очень хорошо написана, постоянное объявление одних и тех же переменных раздражает. Неиспользование условного оператора - тоже. Ну и проверка typeof в конце, хотя там гарантированно либо функция, либо false.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно вытащить текст "Количество помещений (зданий) - всего, единиц" по id (так как далее номера id будут перебираться в цикле)
С txt-файла при двойном клике по ссылке начинается скачивание исходного кода страницыКак сделать, чтобы он просто открывал ссылку в браузере?