Показать сообщение отдельно
  #7 (permalink)  
Старый 02.06.2012, 23:36
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Как подсказывает чутьё, это можно сделать так. Код комментирован.

Запустите код два раза.

Вкратце, об алгоритме

Загружает картинку два раза : в первый раз по обычному URI, второй раз - по новому URI - с добавлением случайного числа в конец. (в этом случае она не берётся из кеша, а загружается заново).
И сравнивает времена загрузок.
PS. вроде работает . В хроме время загрузки из кеша равно 1мс, а в ФФ - 10мс
// путь к картинке.
var origSrc = prompt("Путь к картинке :", "http://proplay.ru/images/users/gallery/77465/177073_l.jpg"); 

// массив с объектами информации о тестовых картинках
// первая - "из кеша", вторая - "холодной загрузки"
var imgs = [ { src: origSrc, el: new Image() }, { src: origSrc+(origSrc.indexOf("?") === -1 ? "?":"&")+Math.random(), el: new Image() } ];

// обработчик события загрузки для тестовых картинок.
// запишет в объект информации время загрузки.
var handler = function(){ 
    // индекс объекта информации для текущей картинки.
    var index = imgs[0].el === this ? 0:1; 
    // её время загрузки.
    imgs[index].loadTime = Date.now() - imgs[index].started; 
    // если загружена другая тестовая картинка
    if ("loadTime" in imgs[index ^ 1]) {
        // то разбираем полёты.
        onTwoImagesLoaded();
    }
};

// для каждой картинки устанавливаем обработчик события загрузки
for(var i = 0; i < 2; i += 1) {
    imgs[i].el.onload = handler;
    // начинаем загрузку
    imgs[i].el.src = imgs[i].src;
    // и записываем время старта загрузки
    imgs[i].started = Date.now();
}

// исполнится, когда загрузятся обе картинки.
function onTwoImagesLoaded() {
    // кеширована - это если время загрузки "из кеша"
    // составляет половину от "холодной" загрузки.
    var cached = imgs[0].loadTime / imgs[1].loadTime < 0.5;
    
    alert(cached ? "Кеширована":"Некеширована");
}

Последний раз редактировалось melky, 02.06.2012 в 23:45.
Ответить с цитированием