Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.06.2012, 22:03
Кандидат Javascript-наук
Отправить личное сообщение для abc_ua Посмотреть профиль Найти все сообщения от abc_ua
 
Регистрация: 20.05.2010
Сообщений: 105

Проверка закэшированности изображения
Здравствуйте, как проверить, закэшировано ли изображение?

вот такой вариант не везде отрабатывает http://jsfiddle.net/LmCFP/. В хроме можно увидеть, что какое-то время уходит на запрос к серверу, видимо поэтому проверка сразу не везде срабатывает(зависит от пинга и очереди задач в js?). Можно приделать таймер, но тогда придется упираться в выбор значения задержки. Например 100мс для кого-то хватит, а у других пинг больше и закэшированное изображение.комплит даст фолс.

Подскажите пожалуйста другое, если таковое есть, решение задачи?


Upd

еще интересует способ как определить, отключены ли в браузере картинки?

Последний раз редактировалось abc_ua, 02.06.2012 в 22:06.
Ответить с цитированием
  #2 (permalink)  
Старый 02.06.2012, 22:13
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от abc_ua
вот такой вариант не везде отрабатывает http://jsfiddle.net/LmCFP/.
после выполнения такого кода картинка в любом случае будет уже закешированной, только если в браузере не отключен кэш

Насколько я знаю, нет у способа определить закэшированность картинки
А еще это просто не нужно
Для чего вам это нужно?
Ответить с цитированием
  #3 (permalink)  
Старый 02.06.2012, 22:25
Аватар для Serg_pnz
Сам по себе
Отправить личное сообщение для Serg_pnz Посмотреть профиль Найти все сообщения от Serg_pnz
 
Регистрация: 09.06.2009
Сообщений: 963

Не знаю насколько правильно и оптимально, но по наитию пользуюсь этой функцией
$.preloadImagesS = function () {
    if (typeof arguments[arguments.length - 1] == 'function') {
        var callback = arguments[arguments.length - 1];
    } else {
        var callback = false;
    }
	var Img = arguments[0]
	$(new Image()).load(function(){
		if (typeof callback == 'function') {
			callback();
		}
	}).attr('src', Img);
}


Пользуюсь так
1. Показываю в img спинер (крутилку)
2. Вызываю функцию
$.preloadImagesS (IMG_URL, function(){ /*обратны вызов*/ });

Если картинка в кеше - всё происходит мгновенно.
Ответить с цитированием
  #4 (permalink)  
Старый 02.06.2012, 22:32
Аватар для Serg_pnz
Сам по себе
Отправить личное сообщение для Serg_pnz Посмотреть профиль Найти все сообщения от Serg_pnz
 
Регистрация: 09.06.2009
Сообщений: 963

Сообщение от abc_ua Посмотреть сообщение
еще интересует способ как определить, отключены ли в браузере картинки?
<img onload()> как-то так
Ответить с цитированием
  #5 (permalink)  
Старый 02.06.2012, 23:01
Кандидат Javascript-наук
Отправить личное сообщение для abc_ua Посмотреть профиль Найти все сообщения от abc_ua
 
Регистрация: 20.05.2010
Сообщений: 105

Gvozd,
Цитата:
после выполнения такого кода картинка в любом случае будет уже закешированной
я в конце приписываю ?random_number, чтобы проверить комплит. скрипт на dom content loaded висит, т.е. незагруженная картинка даст фолс, все правильно.

Нужно плавно показать(opacity) фон сайта при загрузке, если изображение не закэшировано, иначе - показать мгновенно.

Serg_pnz,
Цитата:
<img onload()> как-то так
дополню - как мгновенно определить, с онлоад не вижу вариантов. Например, если нужно подставить что-то вместо картинки: пишем контент, на онлоад скрываем контент, выводим картинку, если так, то не вариант.

Вашу функцию опробую чуть позже, спасибо.
Ответить с цитированием
  #6 (permalink)  
Старый 02.06.2012, 23:09
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от abc_ua
я в конце приписываю ?random_number, чтобы проверить комплит. скрипт на dom content loaded висит, т.е. незагруженная картинка даст фолс, все правильно.
я правильно понял, что вы в своем приложении используете Image.jpg, а проверяете закеширвоанность для совсем других картинок - Image.jpg?1234 , Image.jpg?765 , и с другими рандомными цифрами.
Все это разные картинки с разным кешем
Ответить с цитированием
  #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.
Ответить с цитированием
  #8 (permalink)  
Старый 03.06.2012, 00:17
Кандидат Javascript-наук
Отправить личное сообщение для abc_ua Посмотреть профиль Найти все сообщения от abc_ua
 
Регистрация: 20.05.2010
Сообщений: 105

melky,
хорошая идея, спасибо, возьму на вооружение, но лишний трафик...

Gvozd,
я привел скрипт для проверки мгновенного получения значения img.complete в разных браузерах. Т.е. первый раз получаем фолс, второй - тру, дописываем рандомное число(это гет параметр?) - проверяем еще раз для надежности. Кол-во изображений в данном случае неважно(на сайте предполагается основной фон + дополнительный на отдельных страницах).

Всем спасибо за советы, надеялся, что в js есть какие-то нативные методы проверки.

Скорее всего буду реализовывать вариант с таймером, т.е. делаем замыкание и проверяем комплит, как только значение станет true - проверить задержку: 100мс - показать изображение сразу, больше 100мс - плавно сменить прозрачность.

P.s. вижу, что у знакомых форумчан резко упала карма, почему?

Последний раз редактировалось abc_ua, 03.06.2012 в 00:28.
Ответить с цитированием
  #9 (permalink)  
Старый 03.06.2012, 00:18
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Serg_pnz
01 $.preloadImagesS = function () {
02 if (typeof arguments[arguments.length - 1] == 'function') {
03 var callback = arguments[arguments.length - 1];
04 } else {
05 var callback = false;
06 }
07 var Img = arguments[0]
08 $(new Image()).load(function(){
09 if (typeof callback == 'function') {
10 callback();
11 }
12 }).attr('src', Img);
13 }
почти такойже пользуюсь,но с небольшими отличиями -гружу сразу все.Учитываю что первое изображение может загрузиться последним-проверяю не загрузку последнего -а полную загрузку всех.

Последний раз редактировалось dmitriymar, 03.06.2012 в 00:32.
Ответить с цитированием
  #10 (permalink)  
Старый 03.06.2012, 00:30
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от abc_ua
вижу, что у знакомых форумчан резко упала карма, почему?
Репутация: изменения
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DropDown menu в части изображения Hardip Элементы интерфейса 1 20.04.2012 00:20
Получение высоты изображения theo_ Javascript под браузер 2 21.06.2011 16:04
карта увеличенного изображения Luna82 Элементы интерфейса 11 15.06.2011 10:17
Помогите пожалуйста с обьяснением загрузки изображения на сервер. 0931454574 Серверные языки и технологии 3 11.05.2011 18:05
Проверка размера изображения Bizarre Общие вопросы Javascript 4 09.03.2011 18:02