Плагин или реализация drupal lazyload images?

Есть ли какой-нибудь надежный плагин drupal для ленивой загрузки изображений или кто-нибудь реализовал это?

В идеале я хотел бы применить это только к определенному типу контента и использовать плагин вместо того, чтобы много кодировать / вручную заменять все отдельные узлы ссылками на изображения.

Большинство результатов поиска плагинов довольно старые или имеют ограниченную документацию и мало доказательств концепции. Я нашел только один интересный вопрос здесь Ленивая загрузка заставляет страницы зависать / загружаться очень медленно в IE?, который относится к просто ленивый, кто-нибудь реализовал это или может что-то порекомендовать, пожалуйста?

К вашему сведению - я уже пробовал https://www.drupal.org/project/lazyloader, но, похоже, не имел никакого эффекта / не мог заставить его работать. Я вставлял изображения в узлы через CKEditor. Я понимаю, что этот модуль полагается на модуль изображений drupal, возможно, поэтому он не работал, я просто надеялся, что есть плагин, который заменяет любые обычные ссылки на изображения с ленивой загрузкой, чтобы исключить пользовательские настройки.

Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Разработка Drupal и AngularJS: Идеальное сочетание для вашей веб-стратегии
Разработка Drupal и AngularJS: Идеальное сочетание для вашей веб-стратегии
Один опытный веб-разработчик назвал комбинацию Drupal и AngularJS "сочетанием, созданным на небесах". Почему так? Потому что вместе они могут создать...
5
0
1 915
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

В моем настраиваемом модуле я использовал bLazy, легкий сценарий отложенной загрузки и мульти-обслуживающего изображения.

Модуль довольно прост, я вас расскажу:

В Drupal 7 theme_image () отвечает за вывод разметки <img ... /> для всех изображений, отрисованных программно. Это включает изображения полей и любое ручное использование theme('image', $variables).

Например;

<?php print theme('image', array('path' => $logo, 'alt' => t('Home'))); ?>

Итак, сначала вам нужно переопределить функцию theme_image() через hook_theme_registry_alter (), потому что мы хотим изменить некоторые атрибуты тега IMG на основе требований по умолчанию сценария bLazy.

<?php
/**
 * Implements hook_theme_registry_alter().
 */
function CUSTOMMODULE_theme_registry_alter(&$theme_registry) {
  if (isset($theme_registry['image'])) {
    $theme_registry['image']['function'] = 'theme_CUSTOMMODULE_image';
  }
}

Затем измените вывод разметки <img /> в этой новой функции theme_CUSTOMMODULE_image(). Сравните следующее с функцией тематики theme_image():

<?php
/**
 * Overrides theme_image().
 */
function theme_CUSTOMMODULE_image($variables) {
  // Skip Blazy rendering if variables contain `.no-b-lazy` CSS class name.
  if (!empty($variables['attributes']['class']) && in_array('no-b-lazy', $variables['attributes']['class'])) {
    return theme_image($variables);
  }
  else {
    $attributes = $variables['attributes'];
    $attributes['src'] = file_create_url(drupal_get_path('module', 'CUSTOMMODULE') . '/assets/clear.gif');
    $attributes['data-src'] = file_create_url($variables['path']);
    $attributes['class'][] = 'b-lazy';
    foreach (array(
      'width',
      'height',
      'alt',
      'title',
    ) as $key) {
      if (isset($variables[$key])) {
        $attributes[$key] = $variables[$key];
      }
    }
    return '<img' . drupal_attributes($attributes) . ' />';
  }
}

Я использовал прозрачное изображение GIF размером 1x1 пиксель в качестве изображения-заполнителя в качестве значения атрибута src и исходный путь к изображению в качестве значения data-src. Наконец, добавлено имя класса .b-lazy в качестве селектора по умолчанию.

Остается только загрузить библиотеку bLazy и простой скрипт для загрузки bLazy на каждой странице или на каждой странице темы (без прав администратора).

(function ($) {
  Drupal.behaviors.CUSTOMMODULE = {
    attach: function (context, settings) {
      // @see http://dinbror.dk/blog/blazy/?ref=example-page#Options
      var options = {};
      var bLazy = new Blazy(options);
    }
  };
}(jQuery));

В том же модуле я реализовал ловушку hook_page_build() для прикрепления этих двух файлов javascript. Таким образом, все будет в одном месте.

Я рекомендую прочитать официальное руководство по Добавление JavaScript в вашу тему или модуль, чтобы найти наиболее подходящий метод для вашего проекта.

После включения модуля все образы, прошедшие через theme_image(), будут загружаться лениво.

ДОБАВЛЕН:

Для изображений, добавленных непосредственно в шаблоны .tpl.php, или изображений, добавленных через CKEditor в формах добавления / редактирования узлов, их разметка должна соответствовать тому же шаблону, который определен в настраиваемом модуле, иначе они не будут загружаться лениво.

Чтобы это произошло, я могу думать двумя способами:

  1. Вручную измените разметку каждого изображения в соответствии с настройками bLazy по умолчанию. т.е.
<img src = "low-res-placeholder.jpg" data-src = "original-image.jpg" class = "b-lazy" />
  1. Не обращайте внимания на все вышеперечисленное и используйте bLazy со следующими параметрами для ленивой загрузки каждого изображения на сайте:
var options = {
  selector: "img",
  src: "src",
};
var bLazy = new Blazy(options);

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

Посмотрите Доступные Варианты от bLazy. Возможно, вам придется дополнительно изучить, что лучше подходит для вашего проекта.

Надеюсь это поможет.

РЕДАКТИРОВАТЬ (25 апреля 2018 г.):

Я представил свое решение сообществу Drupal в виде модуля:
https://www.drupal.org/project/lazy

(Скоро я добавлю порт D8)

Вау, спасибо за то, что поделились, и да, в контексте использования ckeditor, хотя я бы подумал, что независимо от этого можно будет применить его через настраиваемый модуль, который заменит эти теги IMG и лениво загрузит их в узлы, что означает не обязательно предварительную обработку, но Почта?!?

Markus 08.04.2018 23:36

Мне нужно еще немного почитать, но я думаю, что видел, как упоминалось, что было бы лучше избегать jQuery? Я обязательно пересмотрю ваш завтра, чтобы увидеть, смогу ли я заставить его работать, было бы хорошо знать, как применить / ограничить его также только для определенного типа контента.

Markus 08.04.2018 23:42

Не забудьте также прочитать документацию bLazy. Как использовать bLazy (ленивая загрузка изображений)If you’re using jQuery (or simliar) do it in document.ready

osman 08.04.2018 23:45

Кроме того, вы можете подумать о создании плагина текстового формата. Я только что ответил на другой аналогичный вопрос для D8: drupal.stackexchange.com/a/259444/63081

osman 09.04.2018 05:07

Большое спасибо @osman, # 2 Я думаю, что это лучший способ, так как у меня слишком много узлов, чтобы вручную редактировать в противном случае, и это было бы инвазивным, поэтому модуль сможет применить его ко многим, надеюсь даже ограничить определенными типами контента / узлов и может таким образом изменить настройку отложенной загрузки в модуле. Вы знаете, как вставить условие для типа содержимого «xyz» в этот модуль текстового формата?

Markus 09.04.2018 09:32

не могли бы вы уточнить, могу ли я создать тот "плагин" текстового формата также для D7, который вы объяснили в другом посте для D8? Этот код входит в специальный модуль или это другой подход? Я бы предпочел не редактировать HTML узлов для реализации blazy. Я посмотрел на №2 выше, но не знал, как начать с модуля для «использования blazy». Нужен ли мне еще (function ($) { Drupal.behaviors.CUSTOMMODULE = { attach: function (context, settings) {? Как запустить этот модуль? Спасибо, Осман.

Markus 09.04.2018 14:32

Посмотрите ответ по ссылке Добавление JavaScript в вашу тему или модуль

osman 09.04.2018 19:10

Вы также можете проверить модуль Примеры для создания модуль фильтра, который вам нужен.

osman 09.04.2018 19:13

@osmann Мне удалось создать собственный модуль для загрузки blazy.min.js и загрузить код из # 2 в blazy_load.js, но, похоже, он не выполняется, используя параметры с селектором img (которого я ожидаю должен работать с моими текущими тегами <img alt scr = /myimage.jpg ">). Я загружаю это неправильно? Запутались, как вы уже упоминали jQuery ...

Markus 10.04.2018 18:31

видя, что в этом есть необходимость, я только что выпустил модуль D7 на drupal.org/project/lazy. Я тоже скоро добавлю версию D8.

osman 11.04.2018 01:52

Вау, ты классный, я попробую и дам тебе знать :) определенно необходимость, учитывая множество результатов поиска, но нехватку встроенных изображений. Возможно, на более позднем этапе стоит подумать о том, чтобы присоединить его к модулю blazy для его улучшения. Насколько я понимаю, ответ на мой вопрос: правильно ли я выполнил blazy, загрузив # 2 в .js, или я что-то пропустил?

Markus 11.04.2018 09:30

Я попробовал ваш модуль, спасибо, выглядит отлично, особенно с настраиваемыми параметрами! Хороший. Я вижу, что blazy.min.js загружен и разметка изменена, но, к сожалению, он еще не запускает загрузку. Я думаю, из-за того, что несколько узлов (модуль faq) отображаются на одной странице, но сначала загружаются с помощью .collapsible (display: block) .collapsed(дисплей: нет) и после нажатия вкладок, чтобы показать содержимое, которое он удаляет .collapsed (display: none). Это будут невидимые (скрытые) элементы? Я попробовал loadInvisible, но он загружает все изображения и, следовательно, больше нет ленивой загрузки. Каким-нибудь образом обойти это?

Markus 11.04.2018 11:38

Рад поболтать, если у вас есть свободное время / день, очень признателен. Я посмотрел на .js, отвечающий за toggleClass свернут, и, хотя я не эксперт по js, мне интересно, может ли мне нужно как-то снова запустить функцию blazy, чтобы она могла сработать?

Markus 11.04.2018 11:56

Еще раз спасибо за этот замечательный модуль и за его дальнейшее улучшение. Я обнаружил одну проблему сейчас, когда она ломает якорные ссылки, и мне интересно, можем ли мы как-то ее решить? drupal.org/project/lazy/issues/2999351#comment-12771971

Markus 13.09.2018 13:20

Еще раз спасибо за создание ленивого модуля, который вы качаете! Не могли бы вы посоветовать повторно "Отключенные страницы", если он поддерживает только определенные полные пути или может пропускать все пути, начиная, например, с events/? Я пробовал много комбинаций, но, похоже, принимает только полные пути. drupal.org/project/lazy/issues/3209086

Markus 16.04.2021 10:24

Я создал модуль отложенной загрузки для drupal 8. Должен работать из коробки: Fancyload - отложенная загрузка изображений в стиле pinterest

Fancyload will automatically provide lazyloading of images on your website in a pinterest-style color scheme. It fetches the main color of your image and serves it until your image is loaded.

Другие вопросы по теме