创建自己的模块可能是最简单的方法。我就是这么做的。
在我的自定义模块中,我使用了bLazy,这是一个轻量级的延迟加载和多服务图像脚本。
该模块非常简单,我将引导您完成:
在 Drupal 7 中,theme_image() 负责为所有以编程方式呈现的图像输出 <img ... /> 标记。这包括现场图像和theme('image', $variables) 的任何手动使用。
例如;
<?php print theme('image', array('path' => $logo, 'alt' => t('Home'))); ?>
所以首先需要通过hook_theme_registry_alter()覆盖theme_image()函数,因为我们要根据bLazy脚本的默认要求来改变IMG标签的一些属性。
<?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';
}
}
然后,在新的 theme_CUSTOMMODULE_image() 函数中更改 <img /> 标记的输出。将以下内容与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) . ' />';
}
}
我使用了一个 1x1 像素的透明 GIF 图片作为占位符图片作为 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 文件。这样,一切都将集中在一个地方。
我建议阅读Adding JavaScript to your theme or module 的官方教程以找到最适合您项目的方法。
启用该模块后,通过theme_image() 传递的所有图像都将被延迟加载。
添加:
对于直接在.tpl.php模板中添加的图像,或者通过CKEditor在节点添加/编辑表单中添加的图像,它们的标记应该遵循自定义模块中定义的相同模式,否则它们不会延迟加载。
要做到这一点,我可以想到两种方法:
- 手动更改每个图像标记以满足 bLazy 的默认设置。即
<img src="low-res-placeholder.jpg" data-src="original-image.jpg" class="b-lazy" />
- 忽略以上所有内容并使用 bLazy 和以下选项来延迟加载网站上的每张图片:
var options = {
selector: "img",
src: "src",
};
var bLazy = new Blazy(options);
我认为这两种选择各有利弊。但是我认为第一种选择比第二种选择更安全、更稳定。根据站点配置,对所有图像启用延迟加载可能会导致意外问题。
查看 bLazy 的 available options。您可能需要进一步调查什么更适合您的项目。
希望这会有所帮助。
编辑(2018 年 4 月 25 日):
我将我的解决方案作为一个模块贡献给 Drupal 社区:
https://www.drupal.org/project/lazy
(我也会尽快添加 D8 端口)