Подгружаем картинки с jQuery
Всем привет. Давненько не обновлял блог. Ездил в Питер на недельку, отдыхал, в интернет заходил редко да и то в основном на телефоне. Сейчас я снова в Гамбурге и постараюсь обновлять блог чаще, если только футбол не помешает
Вчера увидел интересный трюк, как подгружать картинки с jQuery. Все наверное сталкивались с такой ситуацией - надо показать какой нибудь модальный диалог, или lightbox. Так вот загружается этот lightbox, его уже видно, а какие нибудь картинки для бэкграунда ещё не загрузились. И пока они не загрузятся - выглядит такой lightbox тогда не очень красиво.
Решить такую проблему довольно просто. Надо чтобы браузер заранее загрузил все картинки, которые используются в CSS. Scott Jehl написал плагин для jQuery, который делает именно это.
-
/**
-
* --------------------------------------------------------------------
-
* jQuery-Plugin "preloadCssImages"
-
* by Scott Jehl, scott@filamentgroup.com
-
* http://www.filamentgroup.com
-
* reference article: http://www.filamentgroup.com/lab/update_automatically_preload_images_from_css_with_jquery/
-
* demo page: http://www.filamentgroup.com/examples/preloadImages/index_v2.php
-
*
-
* Copyright (c) 2008 Filament Group, Inc
-
* Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
-
*
-
* Version: 3.0, 06.21.2008
-
* Changelog:
-
* 02.20.2008 initial Version 1.0
-
* 06.04.2008 Version 2.0 : removed need for any passed arguments. Images load from any and all directories.
-
* 06.21.2008 Version 3.0 : Added options for loading status. Fixed IE abs image path bug (Thanks Sam Pohlenz).
-
* --------------------------------------------------------------------
-
*/
-
jQuery.preloadCssImages = function(settings){
-
var settings = jQuery.extend({
-
statusTextEl: null,
-
statusBarEl: null
-
}, settings);
-
-
var allImgs = [];//new array for all the image urls
-
var k = 0; //iterator for adding images
-
var sheets = document.styleSheets;//array of stylesheets
-
-
for(var i = 0; i<sheets.length; i++){//loop through each stylesheet
-
var cssPile = '';//create large string of all css rules in sheet
-
var csshref = (sheets[ i ].href) ? sheets[ i ].href : 'window.location.href';
-
var baseURLarr = csshref.split('/');//split href at / to make array
-
baseURLarr.pop();//remove file path from baseURL array
-
var baseURL = baseURLarr.join('/');//create base url for the images in this sheet (css file's dir)
-
if(baseURL!="") baseURL+='/'; //tack on a / if needed
-
if(document.styleSheets[ i ].cssRules){//w3
-
var thisSheetRules = document.styleSheets[ i ].cssRules; //w3
-
for(var j = 0; j<thisSheetRules.length; j++){
-
cssPile+= thisSheetRules[j].cssText;
-
}
-
}
-
else {
-
cssPile+= document.styleSheets[ i ].cssText;
-
}
-
-
//parse cssPile for image urls and load them into the DOM
-
var imgUrls = cssPile.match(/[^\(]+\.(gif|jpg|jpeg|png)/g);//reg ex to get a string of between a "(" and a ".filename"
-
var loaded = 0; //number of images loaded
-
if(imgUrls != null && imgUrls.length>0 && imgUrls != ''){//loop array\
-
var arr = jQuery.makeArray(imgUrls);//create array from regex obj
-
jQuery(arr).each(function(){
-
allImgs[ k ] = new Image(); //new img obj
-
allImgs[ k ].src = (this.charAt(0) == '/' || this.match('http://')) ? this : baseURL + this; //set src either absolute or rel to css dir
-
-
$(allImgs[ k ]).load(function(){
-
loaded++;
-
//send updates to status elements if applicable
-
if(settings.statusTextEl) {$(settings.statusTextEl).html('<span class="numLoaded">'+loaded+'</span> of <span class="numTotal">'+allImgs.length+'</span> loaded (<span class="percentLoaded">'+(loaded/allImgs.length*100).toFixed(0)+'%</span>) <span class="currentImg">Now Loading: <span>'+allImgs[loaded-1].src.split('/')[allImgs[loaded-1].src.split('/').length-1]+'</span></span>');
-
}
-
if(settings.statusBarEl) {
-
var barWidth = $(settings.statusBarEl).width();
-
$(settings.statusBarEl).css('background-position', -(barWidth-(barWidth*loaded/allImgs.length).toFixed(0))+'px 50%');
-
}
-
});
-
k++;
-
});
-
}
-
}//loop
-
return allImgs;
-
}
Этот плагин парсит css и подгружает все найденные картинки. Поэтому когда картинки понадобятся - они появятся мгновенно.
del.icio.us Забобрить!2 Comments so far
Leave a reply
Зато если пользователь ничего не сделает - траффик будет гнаться.
Ну да, недостатки конечно есть. Но картинки закешируются и второй раз их скачивать не придётся.