Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Быстрая и синхронная подгрузка картинок. (https://javascript.ru/forum/xhtml-html-css/40133-bystraya-i-sinkhronnaya-podgruzka-kartinok.html)

Mike_Kharkov 24.07.2013 21:42

Быстрая и синхронная подгрузка картинок.
 
Добрый вечер.
Недавно у меня появился проект на котором требуется, что бы вся графика на странице появлялась(при загрузке страницы) одновременно и без особых задержек.
Вопрос:
Какие механизмы на сегодняшний день существуют в этом плане?
(можно ли это организовать спрайтами или при помощи JS что-нибудь придумать?)

bes 24.07.2013 21:56

Цитата:

Сообщение от Mike_Kharkov
одновременно и без особых задержек.

проверяй был ли onload, как у всех был, тогда и показывать
"без особых задержек" - расплывчатая формулировка
я тоже хочу, чтобы у меня было пару гигов фото, а отобразилось всё мгновенно при открытии страницы :haha:

bes 24.07.2013 22:18

<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<style>
.img {display: none}
</style>
<img src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067">
<img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<script>
jQuery(function ($) {
	var d = 0;
	var images = $(".img");
	var len = images.size();
	images.each(function() {
		$(this).on("load", function () {
			d++;
		});
	});
	var int = setInterval(function () {
		if (d == len) {
			images.show();
			clearInterval(int);
		}
	}, 500);
});
</script>

если вообще все, то просто по window.onload
если хоть с одной будут проблемы, не покажется ничего :)

bes 24.07.2013 22:38

each можно убрать
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<style>
.img {display: none}
</style>
<img src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067">
<img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<script>
jQuery(function ($) {
	var d = 0;
	var images = $(".img");
	var len = images.size();
	images.on("load", function () {
		d++;
	});
	var int = setInterval(function () {
		if (d == len) {
			images.show();
			clearInterval(int);
		}
	}, 500);
});
</script>

рони 24.07.2013 23:18

bes,
а в ие проверяли?

bes 24.07.2013 23:28

Цитата:

Сообщение от рони
bes,
а в ие проверяли?

сейчас проверил - работает, что не так?

bes 24.07.2013 23:32

на форуме через ie - да, чёт не всё ладно

рони 25.07.2013 00:33

bes,
пробовал ие и без форума результат тотже нет картинок.

Mike_Kharkov 25.07.2013 03:00

Цитата:

Сообщение от bes (Сообщение 264079)
на форуме через ie - да, чёт не всё ладно

Цитата:

Сообщение от рони (Сообщение 264082)
bes,
пробовал ие и без форума результат тотже нет картинок.


Проверил у себя:
C форума в IE тоже проблема - но с локалки в IE отображается в норме.(если картинки маленькие.)
Если картинки побольше и все это дело на хостинг залить - то тогда всё это дело работает через раз. (По крайней мере лично у меня..)
http://webmaster.ayrveda.ru/111/js_template.htmlhttp://webmaster.ayrveda.ru/111/js_template.html
Пробовал увеличивать временной интервал(до 3500) - но это не помогает.
В норме работает(всё это дело) только, если картинки уже в кеше браузера есть..

Deff 25.07.2013 03:49

<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>var d = 0;</script>
<div id=out></div>
<div style="position:absolute;z-index:-100;visibility:hidden">
<img  class="img" src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067"  onload="d++">
<img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
</div>
<script>
var len = $(".img").length;
var int = setInterval(function () {
  if (d >= len) {
    $(".img").appendTo("#out");
     clearInterval(int);
  }
}, 100);

</script>

Mike_Kharkov 25.07.2013 04:09

Цитата:

Сообщение от Deff (Сообщение 264094)
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>var d = 0;</script>
<div id=out></div>
<div style="position:absolute;z-index:-100;wisth:2px;height:2px;overflow:hidden" onload="++d">
<img src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067" onload="++d">
<img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="++d">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="++d">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="++d">
</div>
<script>
alert(d)
var len = $(".img").size();
var int = setInterval(function () {
  if (d == len) {
    $(".img").appendTo("#out");
     clearInterval(int);
  }
}, 100);

</script>

У меня почему то этот пример не работает.
(или я что то не правильно понял..)
http://webmaster.ayrveda.ru/333/js_template.html
Поставил интервал 7000 но грузиться все равно всё сразу + не одномоментно.

Deff 25.07.2013 04:14

Mike_Kharkov,
Я поправил

Deff 25.07.2013 04:28

Чуть ускорил:
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>var d = 0;</script>
<style>
.hide {
  position:absolute;
  z-index:-100;
  visibility:hidden;
}
</style>
<div class="hide">
<img  class="img" src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067"  onload="d++">
<img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
</div>
<script>
var len = $(".img").length;
var int = setInterval(function () {
  if (d >= len) {
    $(".hide").removeClass("hide");
     clearInterval(int);
  }
}, 100);
</script>

Mike_Kharkov 25.07.2013 04:36

Всё равно та же проблема.
(на сколько я понял.)
Поставил 3000 - но подгрузка происходит моментально.
http://webmaster.ayrveda.ru/333/js_template.html

Deff 25.07.2013 05:12

Mike_Kharkov,
ерунда увеличивать, - 100 - норма для теста, особенно если картинки малые - у меня нормально работает на всех браузерах и картинках... Поскольку идея однозначная - как только подгружены все - все и вылазит, другое дело, что само открытие картинок, лучше делать после рендинга всей страницы, т.е после загрузки картинок дождаться $(document).ready(function()

<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>var d = 0;</script>
<style>
.hide {
  position:absolute;
  z-index:-100;
  visibility:hidden;
}
</style>
<div class="hide">
<img  class="img" src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067"  onload="d++">
<img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235" onload="d++">
</div>
<script>
var len = $(".img").length;
var int = setInterval(function () {
  if (d >= len) {
$(document).ready(function(){
    $(".hide").removeClass("hide");
    clearInterval(int);
});

  }
}, 100);
</script>


Типично же, применяют вариант подгрузки картинок на предыдущей странице, перед показом, в аналогичный cкрытый div, - без всяких скриптов, (типично пользователь на ней находится долее подгрузки их всех
div должен стоять в самом конце страницы, дабы не утомлять пользователя задержками

Mike_Kharkov 25.07.2013 05:19

Смотрите.
Дело в том, что мне необходимо что бы картинки(в том числе и очень большие, при необходимости) подгружались не по частям, а целиком!
(одномоментно!)
В вашей реализации мне этого добиться не удалось потому, что не могу поставить большой временной интервал.
Если временной интервал ставить маленьким то тогда картинка(если большая + скорость инета маленькая) разворачивается постепенно(как заранее свёрнутый бумажный лист). Именно такое развитие событий и не устраивает моего заказчика.
Из за этого, собственно говоря, я и создал данный пост..
P.S. Понимаете мою мысль?

Deff 25.07.2013 05:31

Цитата:

Сообщение от Mike_Kharkov
то тогда картинка(если большая + скорость инета маленькая) разворачивается постепенно(как заранее свёрнутый бумажный лист).

Тут уже речь не о подгрузке(подгрузка по скрипту уже завершена), а о рендинге - браузером
тут возможны такие Варианты
1. Перевести все картинки в png - уже подгруженные - они рендяцо быстрее - но грузятся чуть долее
2. Отрендить загруженные картинки с opacity: 0 и абсолютным позицонированием
(Окончание рендинга текущей картинки отслеживаем по высоте или ширине картинки(которую желательно знать заранее или тестировать прекращение её приращения), а затем перевести их класс в видимые

Mike_Kharkov 25.07.2013 05:36

Мысль примерно понял.
Спасибо!

>> 2. Отрендить загруженные картинки с opacity: 0 и абсолютным позицонированием
а затем перевести их класс в видимые

Мне кажется абсолютное позиционирование будет лишним в данном случае? Или я ошибаюсь?
(Всё равно же картинка будет изначально прозрачна. Какой смысл её позиционирование изменять?)

Deff 25.07.2013 05:40

Цитата:

Сообщение от Mike_Kharkov
Мне кажется абсолютное позиционирование будет лишним в данном случае? Или я ошибаюсь?

Если не абсолютное - то внешний блок будет видимо менять размеры при большой картинке, если наплевать - то можно и не абсолютно
второе - большие картинки рендяцо и при перемещении по странице
так что желательно выставить обертку уже по размерам и там рендить картинку

Deff 25.07.2013 05:58

:) В принципе, при такой задаче, вероятно удобнее ставить картинки фоном к заранее созданным блокам с выставленными размерами, поскольку блоки с начальным opacity:0;эти блоки должны быть конечными ветками дерева, дабы не влиять на потомков

bes 25.07.2013 06:48

Цитата:

Сообщение от рони
bes,
пробовал ие и без форума результат тотже нет картинок.

http://javascript.ru/forum/misc/3962...-kartinok.html
а я уж начал забывать :)
надо покрутить с форматом адреса, например, лишние символы там убирать или ещё чего, но это вечером

bes 25.07.2013 19:39

попробуем такой ход
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<style>
.img {display: none}
</style>
<img src="http://javascript.ru/forum/image.php?u=18034&dateline=1325652067">
<img class="img" src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<img class="img"src="http://javascript.ru/forum/image.php?u=19820&dateline=1334914235">
<script>
jQuery(function ($) {
	var d = 0;
	var images = $(".img");
	images.each(function() {
		$(this).on("load", function () {
			d++;
		});
		this.src = this.src;
	});
	var len = images.size();
	var int = setInterval(function () {
		if (d == len) {
			images.show();
			clearInterval(int);
		}
	}, 500);
});
</script>

bes 25.07.2013 19:39

как ни странно - работает :)

Deff 25.07.2013 20:51

bes,
Тут есть две идеи
1. Картинка может подгрузиться до jQuery(function ($) {
2. Мелкие картинки могут подгрузиться до окончания блока с картинками, поэтому возможно лучше onload ставить на тег
3. Похоже у чела проблемы не с подгрузкой, а с рендингом больших изо на странице, ибо перевод в bmp и построчное отражение картинки на странице занимает время, в итоге все картинки не будут отражены одновременно, нужно подгружать с opacity:0 или visibility:hidden и тестить окончание приращений высоты

bes 25.07.2013 22:29

Цитата:

Сообщение от Deff
и тестить окончание приращений высоты

первый раз слышу, что можно определить приращение высоты картинки при её загрузке, есть ссылка на API?

Deff 25.07.2013 22:51

bes,
При рендинге - картинка загружена - но большие - рендяцо отражаются долго
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<div style="overflow:auto; width:100%;height:300px">
<img src="http://www.gog.com/upload/images/2013/06/4a97d96f01382e2d3de6435cc9bf4134bf21c62c.jpg">
</div>
<script>
var d=0;
$("img").on("load", function () {
           var height=[]
	var int = setInterval(function () {
		if ($("img").height() == height[0]) {
			alert(height)
			clearInterval(int);
		} height.push($("img").height());
	}, 1);
});
</script>

bes 25.07.2013 22:56

Цитата:

Сообщение от Deff
bes,
При рендинге - картинка загружена - но большие - рендяцо отражаются долго

так можно ли как-то определить это приращение?
через height этого не сделать

Deff 25.07.2013 23:09

bes,
:-E Походу соврал - пойду умоюсь

bes 25.07.2013 23:17

Deff, вот мой простой пример
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<img class="img" src="http://www.gog.com/upload/images/2013/06/4a97d96f01382e2d3de6435cc9bf4134bf21c62c.jpg">
<script>
jQuery(function ($) {
	var img = $(".img").eq(0);
	var int = setInterval(function () {
			console.log(img.height());

	}, 1);
});
</script>

Deff 25.07.2013 23:50

bes,
:) Тогда я не понимаю, почему у чела не одновременно...
Хотя у cyber был подобный эффект при перетаскивании мап карты(хотя может уже забыл нюансы

Mike_Kharkov 26.07.2013 00:44

Цитата:

Сообщение от bes (Сообщение 264233)
Deff, вот мой простой пример
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<img class="img" src="http://www.gog.com/upload/images/2013/06/4a97d96f01382e2d3de6435cc9bf4134bf21c62c.jpg">
<script>
jQuery(function ($) {
	var img = $(".img").eq(0);
	var int = setInterval(function () {
			console.log(img.height());

	}, 1);
});
</script>

Попробовал ваш пример:
http://webmaster.ayrveda.ru/555/js_template.html
Но так как на форуме - данный пример у меня работает только в IE + Mazilla!?
(И то, при условии, что картинка не очень большой должна!)
Не знаете - в чём причина может быть?
(Может с подключением кода что то не так или с хостингом?)

bes 26.07.2013 20:45

Цитата:

Сообщение от Mike_Kharkov
данный пример у меня работает только в IE + Mazilla!?

не знал, что в ie8 есть console.log, хотя явно object код alert(typeof console.log) покажет, если запустить его из самой консоли

пример лишь показывает, что приращение высоты через height не получить

спроси у заказчика, где он увидел подобный эффект

Mike_Kharkov 26.07.2013 20:47

Понял вас. Спасибо!

Mike_Kharkov 26.07.2013 20:48

Но почему тогда ваш пример работает на форуме?
(так как нужно + во всех браузерах..)

bes 26.07.2013 21:01

Цитата:

Сообщение от bes
не знал

если что, не знал, это я про себя

Цитата:

Сообщение от Mike_Kharkov
Но почему тогда ваш пример работает на форуме?
(так как нужно + во всех браузерах..)

с чего ты взял, в ie также ошибку показывает, что определение console отсутствует

Mike_Kharkov 26.07.2013 21:05

Цитата:

Сообщение от bes (Сообщение 264396)
с чего ты взял, в ie также ошибку показывает, что определение console отсутвует

Дело не в ошибке.
Посто визуально картинка с первого раза(когда её в моём кэше ещё не было) открылась мгновенно.
(+ кроссбраузерно.)
Пусть и с небольшой задержкой - но именно так как надо.
(Хотелось бы такой же результат получить и у себя..)

Mike_Kharkov 26.07.2013 21:12

Хотя сейчас подумал и возможно ваш пример сработал у меня так потому, что до этого я просмотрел пример Deffa - а у него такая же картинка использовалась!(только сейчас это увидел..)
Наверное она из за этого уже ко мне в кешь попала и ваш пример соответственно быстро подгрузился..
(Я тогда не обратил внимание на этот факт..)

bes 26.07.2013 21:14

Цитата:

Сообщение от Mike_Kharkov
Дело не в ошибке.
Посто визуально картинка с первого раза(когда её в моём кэше ещё не было) открылась мгновенно.
(+ кроссбраузерно.)
Пусть и с небольшой задержкой - но именно так как надо.
(Хотелось бы такой же результат получить и у себя..)

ты просто не видел, как у меня сейчас в ie через 3G/EDGE эта картинка подтягивалась :)

Mike_Kharkov 26.07.2013 21:28

))


Часовой пояс GMT +3, время: 09:46.