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



Однако создание собственного модуля может быть самым простым путем. Вот что я сделал.
В моем настраиваемом модуле я использовал 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 в формах добавления / редактирования узлов, их разметка должна соответствовать тому же шаблону, который определен в настраиваемом модуле, иначе они не будут загружаться лениво.
Чтобы это произошло, я могу думать двумя способами:
<img src = "low-res-placeholder.jpg" data-src = "original-image.jpg" class = "b-lazy" />
var options = {
selector: "img",
src: "src",
};
var bLazy = new Blazy(options);
Думаю, у обоих вариантов есть свои плюсы и минусы. Однако я считаю, что первый вариант намного безопаснее и стабильнее второго. Включение отложенной загрузки для всех изображений может вызвать непредвиденные проблемы в зависимости от конфигурации сайта.
Посмотрите Доступные Варианты от bLazy. Возможно, вам придется дополнительно изучить, что лучше подходит для вашего проекта.
Надеюсь это поможет.
РЕДАКТИРОВАТЬ (25 апреля 2018 г.):
Я представил свое решение сообществу Drupal в виде модуля:
https://www.drupal.org/project/lazy
(Скоро я добавлю порт D8)
Мне нужно еще немного почитать, но я думаю, что видел, как упоминалось, что было бы лучше избегать jQuery? Я обязательно пересмотрю ваш завтра, чтобы увидеть, смогу ли я заставить его работать, было бы хорошо знать, как применить / ограничить его также только для определенного типа контента.
Не забудьте также прочитать документацию bLazy. Как использовать bLazy (ленивая загрузка изображений)If you’re using jQuery (or simliar) do it in document.ready
Кроме того, вы можете подумать о создании плагина текстового формата. Я только что ответил на другой аналогичный вопрос для D8: drupal.stackexchange.com/a/259444/63081
Большое спасибо @osman, # 2 Я думаю, что это лучший способ, так как у меня слишком много узлов, чтобы вручную редактировать в противном случае, и это было бы инвазивным, поэтому модуль сможет применить его ко многим, надеюсь даже ограничить определенными типами контента / узлов и может таким образом изменить настройку отложенной загрузки в модуле. Вы знаете, как вставить условие для типа содержимого «xyz» в этот модуль текстового формата?
не могли бы вы уточнить, могу ли я создать тот "плагин" текстового формата также для D7, который вы объяснили в другом посте для D8? Этот код входит в специальный модуль или это другой подход? Я бы предпочел не редактировать HTML узлов для реализации blazy. Я посмотрел на №2 выше, но не знал, как начать с модуля для «использования blazy». Нужен ли мне еще (function ($) { Drupal.behaviors.CUSTOMMODULE = { attach: function (context, settings) {? Как запустить этот модуль? Спасибо, Осман.
Посмотрите ответ по ссылке Добавление JavaScript в вашу тему или модуль
Вы также можете проверить модуль Примеры для создания модуль фильтра, который вам нужен.
@osmann Мне удалось создать собственный модуль для загрузки blazy.min.js и загрузить код из # 2 в blazy_load.js, но, похоже, он не выполняется, используя параметры с селектором img (которого я ожидаю должен работать с моими текущими тегами <img alt scr = /myimage.jpg ">). Я загружаю это неправильно? Запутались, как вы уже упоминали jQuery ...
видя, что в этом есть необходимость, я только что выпустил модуль D7 на drupal.org/project/lazy. Я тоже скоро добавлю версию D8.
Вау, ты классный, я попробую и дам тебе знать :) определенно необходимость, учитывая множество результатов поиска, но нехватку встроенных изображений. Возможно, на более позднем этапе стоит подумать о том, чтобы присоединить его к модулю blazy для его улучшения. Насколько я понимаю, ответ на мой вопрос: правильно ли я выполнил blazy, загрузив # 2 в .js, или я что-то пропустил?
Я попробовал ваш модуль, спасибо, выглядит отлично, особенно с настраиваемыми параметрами! Хороший. Я вижу, что blazy.min.js загружен и разметка изменена, но, к сожалению, он еще не запускает загрузку. Я думаю, из-за того, что несколько узлов (модуль faq) отображаются на одной странице, но сначала загружаются с помощью .collapsible (display: block) .collapsed(дисплей: нет) и после нажатия вкладок, чтобы показать содержимое, которое он удаляет .collapsed (display: none). Это будут невидимые (скрытые) элементы? Я попробовал loadInvisible, но он загружает все изображения и, следовательно, больше нет ленивой загрузки. Каким-нибудь образом обойти это?
Рад поболтать, если у вас есть свободное время / день, очень признателен. Я посмотрел на .js, отвечающий за toggleClass свернут, и, хотя я не эксперт по js, мне интересно, может ли мне нужно как-то снова запустить функцию blazy, чтобы она могла сработать?
Еще раз спасибо за этот замечательный модуль и за его дальнейшее улучшение. Я обнаружил одну проблему сейчас, когда она ломает якорные ссылки, и мне интересно, можем ли мы как-то ее решить? drupal.org/project/lazy/issues/2999351#comment-12771971
Еще раз спасибо за создание ленивого модуля, который вы качаете! Не могли бы вы посоветовать повторно "Отключенные страницы", если он поддерживает только определенные полные пути или может пропускать все пути, начиная, например, с events/? Я пробовал много комбинаций, но, похоже, принимает только полные пути. drupal.org/project/lazy/issues/3209086
Я создал модуль отложенной загрузки для 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.
Вау, спасибо за то, что поделились, и да, в контексте использования ckeditor, хотя я бы подумал, что независимо от этого можно будет применить его через настраиваемый модуль, который заменит эти теги IMG и лениво загрузит их в узлы, что означает не обязательно предварительную обработку, но Почта?!?