如何为 SVG 图像元素实现延迟加载?

How to implement lazy load for an SVG image element?

在一个 svg 标签中,有多个图像元素,显示缩略图。由于图片较多,页面加载时间较长。所以我想实现一个像 David Walsh’s Simple Image Lazy Load and Fade 这样简单的延迟加载。对于 img 元素,它工作正常。但对于 SVG 区域的图像元素,将不会加载。 示例:

<div>
    <img id="myimg" height="20" width="20" data-src="img1.jpg"/>
</div>
<div>
    <svg width="10%">
    <image id="myimage" height="20" width="20" xlink:href="img1.jpg"/>
    </svg>
</div>

和JS编码:

// This works fine
var img = jQuery("#myimg");
img.attr('src', img.attr('data-src'));
img.on("load", function () {
    img.removeAttr('data-src');
});

// This doens't work, onload will not be processed, image will not be not shown
var image = jQuery("#myimage");
image.attr('xlink:href', image.attr('data-href'));
image.on("load", function () {
    image.removeAttr('data-href');
});

脚本将以这种方式离开页面:

<div>
    <img id="myimg" height="20" width="20" data-src="img1.jpg"/>
</div>
<br>
<div>
    <svg width="10%">
    <image id="myimage" height="20" width="20" data-href="img1.jpg" xlink:href="img1.jpg"/>
    </svg>
</div>

为什么 onload 不适用于此 SVG 图像元素?

你有几个小错误:
<image/> 是一个 self-closing 标签,
xlink:href 应在没有 xlink: 前缀的情况下使用,
最好在 更改属性之前设置 eventListener

查看代码片段:

var image = jQuery("#myimage");
image.on("load", function () {
    console.log('loaded');
    image.removeAttr('data-href');
});
image.attr('href', image.attr('data-href'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg>
    <image id="myimage" width="150" height="150" data-href="https://pbs.twimg.com/profile_images/843090368837042176/Nl-rCb9c_400x400.jpg"/>
</svg>

这是我对同一问题的解决方案,我一直使用 xlink:href 属性让光栅图像显示在 SVG 中,但在单击时仍然延迟加载。我正在使用不同的延迟加载插件 (jquery.lazy.js),但它非常相似:

<svg>
    <image id="lazy-img" class="lazy" width="" height="" data-source="myimage.jpg" />
</svg>

$('.someElement').on('click', function() {
    var image = $('#lazy-img");
    image.attr('xlink:href', 'myimage.jpg');
    image.attr('href', 'myimage.jpg');
 });

想法是初始 HTML 标记用于延迟加载图像,在图像延迟加载后,在单击事件中我们将标记交换回 SVG。