Javascript Lazy Loading
Сам недавно с подобным столкнулся. Написал джаваскрипт класс, который будет использоваться довольно редко. Размер у файла получился довольно большой и стало жалко траффика. Что делать?
А делать надо вот что - подгружать этот файл только тогда, когда это действительно надо. Сделать это довольно просто со следующим скриптом.
JavaScript:
-
/**
-
* 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);
-
}
-
}
Использовать очень просто. Можно или просто подгрузить нужный файл:
JavaScript:
-
LazyLoader.load('js/ajaxrussia.js');
Или погрузить с callbacks. Tо есть чтобы сразу после загрузки выполнить какую нибудь функцию:
JavaScript:
-
LazyLoader.load('js/ajaxrussia.js', function(){
-
var test= new AjaxRussia('test');
-
});
Для работы скрипта нужен Prototype.
del.icio.us Забобрить!6 Comments so far
Leave a reply
Правильный ответ на “что делать” это:
1. Минифицировать скрипт или отдавать его в gzip
2. Выдавать кэширующие заголовки expired, ETag и т.п.
3. Приращивать версию, когда нужно.
Правильный ответ - это смотреть по ситуации. Когда на сайте пол-миллиона pageviews в день, то gzip и headers не всегда спасают.
Большое спасибо за интересное решение, которое, что называется “в тему”.
Было бы интересно узнать поподробнее
[…]Вашему вниманию мы показываем подборку отличных блогов Рунета[…]
Интересная тема, Спасибо!