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"

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

Эффект параллакса накладываемый на теги изображений, а не на фон

Эффект искажения фотографии основанный на WebGL, похожий на нахождение под водой

Модальное окно с QR-кодом ссылки на текущую страницу

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

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

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

  • Илья:

    У вас нет готового решения для отложенной загрузки (загрузки по клику) для видео VK.com
    Не могу найти нормального JS. Сам написать не могу.

    Ответить
    • Alexander:

      ВК Видео вставляется фреймом
      А если загружать по клику, то это другая тема.

      Ответить
      • Илья:

        Т.е. с помощью jquery.lazy.iframe.js можно сделать вставку VK видео?

        Ответить
        • Alexander:

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

          Ответить
  • Кирилл:

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

    Ответить
    • Alexander:

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

      Ответить
  • Ingvar:

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

    Ответить
    • Alexander:

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

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

    Здравствуйте, имеется такой код, в результате цикла генерируются div блоки с canvas, внутри iv3d модель - тяжелая от 10Мб, вызывается это в сплывающем окошке. на сайте есть скрипт процентов загрузки сайта и пока до 100% не загрузится, висит табличка. и из-за тяжести блоков с 3d загрузка долгая, можно ли с помощью данного плагина сделать отложенную загрузку div с 3d?
    [code]<?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;

    ?>[/code]

    Ответить
    • Alexander:

      Я так понял основная загрузка приходится на?
      [code]<canvas id="'.$title_3d.'" class="can3d" > </canvas>[/code]

      Если так, то можно подключить их по аналогии с [url="https://atuin.ru/blog/otlozhennaya-zagruzka-yandeks-karty-i-vidzheta-vk/"]картой[/url]
      Т.е. после скрола, создаем канвас и присваиваем ему нужный айди и класс.
      Или после скрола подключить скрипт, который отрисовывает их.

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

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

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

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

        [url="http://чпу-снк.рф"]Вот сам сайт... если что[/url]

        Ответить
        • Alexander:

          Вам лучше не лази делать, а подключать 3д модель вместе с модальным окном
          Ставим в нем пустой канвас:
          [code]<div id="diva" class="white-popup mfp-hide">
          <canvas class="can3d"></canvas>
          </div>[/code]
          По клику на открытие, добавляем скрипт:
          [code]$('.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});
          });[/code]
          Удаляем эти подключения с шапки, а у боди
          [code]onload="ivCommonInit3d()"[/code]

          Ответить
        • Alexander:

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

          Ответить