Archive for the 'jQuery' Category
Подгружаем картинки с 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 commentsХостим Javascript на Google
Вам никогда не приходила в голову мысль, как было бы здорово если все сайты хостили популярные джаваскрипт библиотеки на одном сервере? Только подумайте сколько траффика это бы всем сэкономило. Зашёл на один сайт, например Digg.com, браузер скачал ихний jQuery, потом перешёл на другой сайт, где используется тот же скрипт и уже скачивать ничего не надо. На Yahoo уже давно это делали для YUI, так а почему этого нету для других библиотек? Теперь есть!
Ребята из Google AJAX Libraries API объявили, что теперь будут хостить все популярные библиотеки на серверах Google. Больше не придётся думать о кэшинге, gzip-е, хостинге, трффике и тд. На данный момент поддерживаются Prototype, Script.aculo.us, jQuery, Dojo и MooTools. Read more
8 commentsКалендарь на jQuery
Наверняка многие знакомы с Datepicker из библиотеки jQuery UI. Разработчики из Filament Group решили сделать на базе кода из Datepicker - новый календарь. Получилось очень здорово. Можно выбирать как конкретную дату, так и промежуток времени. В этом случае появляется второй календарь.
Так же мне понравилось, что с выключенным джаваскриптом страницей можно всё равно пользоваться. На месте календаря появляются 2 input поля.
Посмотреть на скрипт в деле можно ТУТ.
No commentsjQuery 1.2.2
Библиотеке jQuery исполнилось 2 года и разработчики выпустили к этой дате новый релиз 1.2.2. Релиз очень интересный. Кроме различных исправлений багов есть несколько новых функций и улучшений. Read more
jQuery on Rails
Наверняка есть фанаты jQuery, которые не хотят пользоваться Ruby on Rails из за того, что с рельсами в комплекте идут Prototype и Script.aculo.us. Теперь этому пришёл конец. И всё благодаря одному плагину - jRails. После его установки, все функции, которые раньше выдавали джаваскрипт, будут выдавать код jQuery.
Список поддерживаемых функций:
Prototype:
- form_remote_for
- form_remote_tag
- link_to_remote
- observe_field
- observe_form
- periodically_call_remote
- remote_form_for
- submit_to_remote
Script.aculo.us:
- draggable_element
- drop_receiving_element
- sortable_element
- visual_effect
RJS:
- hide
- insert_html
- remove
- replace
- replace_html
- show
- toggle
Работу эффектов можно посмотреть по этой ссылке. Автор утверждает, что все эффекты работают идентично аналогам от Script.aculo.us.
А я попробую этот плагин в деле. Сделаю асинхронный запрос на сервер, получу оттуда время и покажу этот результат в DIV'e. Read more
No comments