Отложенная загрузка контента

jQuery и Zepto плагин Lazy — это быстрый, многофункциональный и легкий плагин для отложенной загрузки контента. Другими словами, загрузки только того материала, который виден на экране.

Это вторая часть его описания, в которой рассмотрены его дополнения. Первая часть: Отложенная загрузка изображений

Оглавление:

Для отслеживания процесса загрузки нажмите на меню справа (в десктопной версии)

Установка:

jquery.lazy и его дополнения доступны для подключения через cdnjs и jsDelivr CDN:

Использование:

Инициализируем скрипт после загрузки страницы к нужному элементу:

Функции обратного вызова и настройки плагина можно посмотреть в теме: Отложенная загрузка изображений

Отложенная загрузка AJAX:

Имена: ajax, get, post, put

Параметры: data-src, data-method, data-type

По умолчанию для: -

AJAX может получать данные с заданного url и вставлять ответ во внутренний html-код элемента. Это полезно, когда нужно загрузить большее количество контента. По умолчанию в качестве имени загрузчика используется ajax. Но есть некоторые сокращенные названия для конкретных типов запросов GET, POST и PUT.

В запросах POST и PUT обратный вызов ajaxCreateData будет выполняться перед каждым вызовом AJAX. При использовании функция обратного вызова должна возвращать значение параметра data jQuery AJAX функции.

Пример:

Отложенная загрузка аудио / видео:

Имена: av, audio, video

Параметры: data-src, data-poster

По умолчанию для: <audio>, <video>

Загружает элементы <audio> и <video> и прикрепляет источники и дорожки по порядку.

Существует два способа подготовки аудио и/или видео тегов. Первый способ заключается в добавлении всех источников по атрибуту data-src через запятую по формату файла.

Другой способ - добавить источники и треки, в качестве дочерних элементов.

Пример:

Отложенная загрузка фреймов:

Имена: frame, iframe

Параметры: data-src, data-error-detect

По умолчанию для: <iframe>

Загружает содержимое <iframe>. Значение по умолчанию возвращает успешную загрузку, даже если url-адрес iframe недоступен (например, 404 или неправильный url-адрес). Если известно, что запрашиваемый путь доступен и нет необходимости в проверке ошибок, можно использовать этот способ.

Второй способ поддерживает проверку ошибок. Он загрузит содержимое с помощью AJAX и проверит ответ. Используется только на том же домене.

Чтобы включить эту функцию, нужно установить атрибут data-error-detect значение true или 1

Пример:

Отложенная загрузка картинок:

Имена: pic, picture

Параметры: data-src, data-srcset, data-media, data-sizes

По умолчанию для: <picture>

Загружает элементы <picture>, а не <img>, которые описаны в теме "Отложенная загрузка изображений" и прикрепляет источники. Есть два способа, которыми можно подготовить изображение.

Первый способ - создать все дочерние элементы одной строкой:

Второй способ - добавить источники, такие как default, в качестве дочерних элементов.

Пример:

Отложенная загрузка JavaScript:

Имена: js, javascript, script

Параметры: data-src

По умолчанию для: <script>

Загружает файлы JavaScript на элемент <script>.

Примечание: Обнаружение видимого экрана работает в некоторых браузерах некорректно. Поэтому может оказаться так, что все файлы скриптов начнут загружаются сразу после загрузки страницы.

В Chrome и Firefox у меня загрузка скрипта происходила сразу, но ее можно инициализировать после другого события, через колбек afterLoad. На примере скрипт загружается после того, как загрузится картинка <picture> из предыдущего примера.

Пример:

Отложенная загрузка видео с Vimeo:

Имена: vimeo

Параметры: data-src

По умолчанию для: -

Загружает видео Vimeo в <iframe>. Устанавливается фрейм предложенный Vimeo, добавляется идентификатор видео в атрибут data-src и имя загрузчика

Пример:

Отложенная загрузка видео с YouTube :

Имена: yt, youtube

Параметры: data-src, data-nocookie

По умолчанию для: -

Загружает видео YouTube в <iframe>. Устанавливается фрейм предложенный youtube, добавляется идентификатор видео в атрибут data-src и имя загрузчика

Если нужно, можно управлять поведением файлов cookie встроенного видео с помощью атрибута data-nocookie="1". Это изменит адрес на youtube-nocookie.com вместо youtube.com.

Пример:

NOOP загрузчик:

Имена: noop, noop-success, noop-error

Параметры: -

По умолчанию для: -

Загрузчик NOOP (или no-operations), как и сказано в названии, ничего не делает. При использовании загрузчика NOOP даже обратные вызовы, такие как beforeLoad или onError не будут срабатывать. Это может быть полезно для разработчиков или для простого, безопасного и быстрого отключения других загрузчиков. Его можно использовать со всеми элементами.

Есть еще два загрузчика NOOP, которые помогают отлаживать код. Загрузчики noop-success и noop-error вернут текущее состояние в Lazy и вызовут правильные колбеки.

Функции обратного вызова и настройки плагина можно посмотреть в теме: Отложенная загрузка изображений

Плагин jquery.lazy на сайте авторов
Плагин jquery.lazy на github
Видео: Oddworld, Hiérophante - Clichés
Аудио: Comfort Fit - "Sorry"

Смотрите также:

Добавить комментарий:

Ваш комментарий отправлен!

Комментарии:

  • Кирилл:

    так удивительно ) Статья про отложенную загрузку, а страница грузится 30+ секунд на 500 мб канале ... )))
    Просто забавно. Наверно что-то где-то отвалилось.

    Ответить
    • Alexander:

      Справа есть консоль, можете там посмотреть что загрузилось а что нет.
      У меня страница полностью загрузилась на 1.1мб за 1.4 сек, а далее, по мере прокрутки вниз, подгружается остальное.
      Может РСЯ свою лепту вносит, или хост притормозил.

      Ответить
  • Ingvar:

    Привет! А как это влияет на СЕО и оптимизацию, как реагирует гугл на скорость загрузки страницы и так далее?

    Ответить
    • Alexander:

      Оно для этого и нужно, чтобы и гуглы и люди лучше реагировали

      Ответить
  • Ярослав:

    Здравствуйте, имеется такой код, в результате цикла генерируются div блоки с canvas, внутри iv3d модель - тяжелая от 10Мб, вызывается это в сплывающем окошке. на сайте есть скрипт процентов загрузки сайта и пока до 100% не загрузится, висит табличка. и из-за тяжести блоков с 3d загрузка долгая, можно ли с помощью данного плагина сделать отложенную загрузку div с 3d?

    <?php    
    	 
    			$file3d = ''; // переменная для цикла с HTML
    			$newArr3d = array();
    			$file_parts_3d = array();
    			$ext_3d='';
    			$title_3d='';
    			$ar_title_3d = array();
    			$dir3d = '3d';
    			$allowed_types_3d=array('iv3d');
    			
    			
    			$fileico = ''; // переменная для цикла с HTML
    			$newArrIco = array();
    			$file_parts_ico = array();
    			$ext_ico='';
    			$title_ico='';
    			$ar_title_ico = array();
    			$dirico='ico';
    			$allowed_types_ico=array('jpg');
    			$i=0;
    			$ii=0;
    			
    			
    $iterico = new FilesystemIterator($dirico, FilesystemIterator::KEY_AS_FILENAME);			
    $iter3d = new FilesystemIterator($dir3d, FilesystemIterator::KEY_AS_FILENAME);
    
    
    
    
    //----------------------------------------------------------------------------------------
    //------------цикл для картинок-------------------------------------------------------
    foreach($iterico as $filePathico):
    $infileico = $iterico;
    $ar_title_ico[] = $filePathico;
    	endforeach;	
    	
    //------------ массив картинок в строку --------------------
    
    $n_fileico_ar = implode(' ',$ar_title_ico);
    $new_fileico_ar = explode('ico/',$n_fileico_ar);
    $newArrIco = array_diff($new_fileico_ar,array(''));
    sort($newArrIco);
    reset($newArrIco);
    
    //------------цикл для 3d-------------------------------------------------------
    foreach($iter3d as $filePath3d):
    $infile3d = $iter3d;
    $ar_title_3d[] = $filePath3d;
    	endforeach;	
    //------------ массив 3d в строку --------------------
    $n_file3d_ar = implode(' ',$ar_title_3d);
    $new_file3d_ar = explode('3d/',$n_file3d_ar);
    $newArr3d = array_diff($new_file3d_ar,array(''));
    sort($newArr3d);
    reset($newArr3d);
    
    
    
    
    
    //-------------тестовый вывод------------
    
    /*
    echo"$fileico";
    echo"<br>";
    echo"$file3d";
    echo"<br>";
    */
    //----------------------------------------------------
    while ($ii<count($newArr3d)):
    
    		$file3d = $newArr3d[$i];
    		$fileico = $newArrIco[$i];
    
    
    		$file_parts_ico = explode('.',$fileico);
    		$ext_ico = strtolower(array_pop($file_parts_ico));
    		$title_ico = implode('.',$file_parts_ico);
    		$title_ico = htmlspecialchars($title_ico);
    
    		$file_parts_3d = explode('.',$file3d);
    		$ext_3d = strtolower(array_pop($file_parts_3d));
    		$title_3d = implode('.',$file_parts_3d);
    		$title_3d = htmlspecialchars($title_3d);				
    
    				echo '<div id="div'.$title_3d.'" class="white-popup mfp-hide">
    					   <canvas id="'.$title_3d.'"    class="can3d" > </canvas>
    					  </div>
    					
    					<div class="col-md-4 col-sm-6">
    						<div class="box-work">
    							<div class="work-preview">
    									<a href="#div'.$title_3d.'" title="'.$title_ico.'" class="open-popup-link"><img src="'.$dirico.'/'.$fileico.'" class="imgsmall" alt=""></a>
    								<div class="hover">
    									<div class="link-btns">
    										<a href="#div'.$title_3d.'" title="'.$title_ico.'" class="open-popup-link"><i class="fa fa-search-plus"></i></a>
    									</div>
    								</div>
    							</div>
    						</div>
    					</div>
    					';
    	
    			$i++;
    			$ii++;
    endwhile;
    
    ?>
    Ответить
    • Alexander:

      Я так понял основная загрузка приходится на?

      <canvas id="'.$title_3d.'" class="can3d" > </canvas>

      Если так, то можно подключить их по аналогии с картой
      Т.е. после скрола, создаем канвас и присваиваем ему нужный айди и класс.
      Или после скрола подключить скрипт, который отрисовывает их.

      Лучше бы конечно поглядеть живой пример, а не код.

      Ответить
      • Ярослав:

        в принципи да. Думаю переделать в основе всЁ. Сделать php генерацию страниц в определенную папку с 3d моделями, далее сканирование и создание записей в index и загрузка во всплывающем окне с применением pace.js

        Ответить
        • Alexander:

          Вам лучше не лази делать, а подключать 3д модель вместе с модальным окном
          Ставим в нем пустой канвас:

          <div id="diva" class="white-popup mfp-hide">
          	<canvas class="can3d"></canvas>
          </div>

          По клику на открытие, добавляем скрипт:

          $('.open-popup-link').click(function() {
          	var canID = $(this).attr('title'); // Берем атрибут title у ссылки
          	var modalID = $(this).attr('href'); // Берем атрибут href у ссылки
          	$(modalID +' canvas').attr('id', canID); // Устанавливаем ID у канваса
          	
          	// Далее подключаем саму модель, если я правильно понял, то так:
          	var canvas = document.getElementById(canID);
          	canvas.width = window.innerWidth;
          	canvas.height = window.innerHeight;
          	view3d=new iv.window({canvas:canvas,file:"3d/"+ canID +".iv3d",color:0x777777});
          });

          Удаляем эти подключения с шапки, а у боди

          onload="ivCommonInit3d()"
          Ответить
        • Alexander:

          Даже можно ID у канваса отсавить, а по клику подключать только анимацию.

          Ответить