Archive for June, 2008
Подгружаем картинки с Prototype
Все читали статью Подгружаем картинки с jQuery? Довольно таки забавный скрипт. Захотел вставить его на свою страницу и вспомнил, что на ней совсем не jQuery, а Prototype. Что же делать? А просто взять и переписать скрипт для Prototype.
Работает новый скрипт точно также. Парсит CSS стили на странице, достаёт из них все картинки и подгружает их. Единственное что я не стал делать, это систему оповещения о статусе загрузки. Мне это не надо, но сделать это не сложно. Сравните мой код с плагином jQuery и будет ясно куда этот вставить.
-
var AjaxRussia = {};
-
AjaxRussia.ImagePreloader = Class.create({
-
-
initialize: function(){
-
-
$A(document.styleSheets).each(function(sheet){
-
var cssPile = '';
-
var csshref = (sheet.href) ? sheet.href : 'window.location.href';
-
var baseURLarr = csshref.split('/');
-
baseURLarr.pop();
-
var baseURL = baseURLarr.join('/');
-
if (!baseURL.blank())
-
baseURL += '/';
-
if (sheet.cssRules) {
-
var thisSheetRules = sheet.cssRules;
-
$A(thisSheetRules).each(function(rule){
-
cssPile += rule.cssText;
-
});
-
}
-
else {
-
cssPile += sheet.cssText;
-
}
-
-
var imgUrls = cssPile.match(/[^\(]+\.(gif|jpg|jpeg|png)/g);
-
if (imgUrls != null && imgUrls.length> 0 && imgUrls != '') {
-
$A(imgUrls).each(function(url){
-
var image = new Image();
-
image.src = (url.charAt(0) == '/' || url.match('http://')) ? url : baseURL + url;
-
});
-
}
-
});
-
}
-
});
Использовать скрипт просто:
-
new AjaxRussia.ImagePreloader();
Только не надо этот код просто так писать на страницу. Иначе при каждой загрузке страницы CSS будет заново парситься. Я наверное буду вызывать AjaxRussia.ImagePreloader() только если у пользователя нету определённого куки. Ну а после работы AjaxRussia.ImagePreloader() соответственно эту куки сажать.
Подгружаем картинки с 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 и подгружает все найденные картинки. Поэтому когда картинки понадобятся - они появятся мгновенно.
2 commentsJavascript Lazy Loading
Сам недавно с подобным столкнулся. Написал джаваскрипт класс, который будет использоваться довольно редко. Размер у файла получился довольно большой и стало жалко траффика. Что делать?
А делать надо вот что - подгружать этот файл только тогда, когда это действительно надо. Сделать это довольно просто со следующим скриптом.
-
/**
-
* Script lazy loader 0.5
-
* Copyright (c) 2008 Bob Matsuoka
-
* This program is free software; you can redistribute it and/or
-
* modify it under the terms of the GNU General Public License
-
* as published by the Free Software Foundation; either version 2
-
* of the License, or (at your option) any later version.
-
*/
-
var LazyLoader = {}; //namespace
-
LazyLoader.timer = {}; // contains timers for scripts
-
LazyLoader.scripts = []; // contains called script references
-
LazyLoader.load = function(url, callback){
-
-
// handle object or path
-
var classname = null;
-
var properties = null;
-
-
try {
-
// make sure we only load once
-
if ($A(LazyLoader.scripts).indexOf(url) == -1) {
-
// note that we loaded already
-
LazyLoader.scripts.push(url);
-
var script = document.createElement("script");
-
script.src = url;
-
script.type = "text/javascript";
-
$$("head")[0].appendChild(script); // add script tag to head element
-
// was a callback requested
-
if (callback) {
-
// test for onreadystatechange to trigger callback
-
script.onreadystatechange = function(){
-
if (script.readyState == 'loaded' || script.readyState == 'complete') {
-
callback();
-
}
-
}
-
// test for onload to trigger callback
-
script.onload = function(){
-
callback();
-
return;
-
}
-
// safari doesn't support either onload or readystate, create a timer
-
// only way to do this in safari
-
if ((Prototype.Browser.WebKit && !navigator.userAgent.match(/Version\/3/)) || Prototype.Browser.Opera) { // sniff
-
LazyLoader.timer[url] = setInterval(function(){
-
if (/loaded|complete/.test(document.readyState)) {
-
clearInterval(LazyLoader.timer[url]);
-
callback(); // call the callback handler
-
}
-
}, 10);
-
}
-
}
-
}
-
else {
-
if (callback) {
-
callback();
-
}
-
}
-
}
-
catch (e) {
-
alert(e);
-
}
-
}
Использовать очень просто. Можно или просто подгрузить нужный файл:
-
LazyLoader.load('js/ajaxrussia.js');
Или погрузить с callbacks. Tо есть чтобы сразу после загрузки выполнить какую нибудь функцию:
-
LazyLoader.load('js/ajaxrussia.js', function(){
-
var test= new AjaxRussia('test');
-
});
Для работы скрипта нужен Prototype.
6 commentsYahoo! Design Stencil Kit 1.0
На Yahoo Developer Network опубликовали Yahoo! Design Stencil Kit 1.0. Это ни что иное как шаблоны для элементов интерфейса пользователя. Всё что связано с интернетом: формы, кнопки, меню, табы, размер шрифта, размеры экранов, даже элементы интерфейса для айфона - всё есть в их релизе.
Думаю всем будет интересно взглянуть, даже дизайнерам.
Релиз можно скачать в следующих форматах:
