如何在加载实际图像之前在SVG中显示占位符图像?

时间:2013-09-17 18:39:30

标签: svg d3.js

我正在使用D3.js渲染包含光栅图像的节点的图形。

var mainscreenURL = s3_base_url + viewController + "/screenshot.jpeg";
svg.select(".mainScreen").transition().attr("height",0).remove();

svg.append("image").attr("xlink:href", mainscreenURL)
        .attr("width", mainScreenW)
        .attr("height", mainScreenH)
        .attr("x", (w / 2) - (mainScreenW / 2)) 
        .attr("y", (h / 2) - (mainScreenH / 2)) 
        .attr("class", "mainScreen")
        .attr("id", viewController)
}); 

其中一些图像非常大,因此HTTP请求(由浏览器隐式发出)可能需要相当长的时间。我无法缓存图像,因为它们是动态生成的。

如果这是常规HTML,我会显示一个占位符图像,然后在成功完成HTTP get请求后将其交换出来。但由于这是SVG,没有明确的要求,我最终得到一个令人讨厌的破碎图像,然后被真实的东西取代。

当图像完全装满时,我是否可以勾选任何事件?

2 个答案:

答案 0 :(得分:3)

参见相关内容:Is it possible to listen image load event in SVG?

我无法使用原生addEventListener方法,但看起来您可以设置onload属性(至少在Chrome中有效):

svg.append("image")
    .attr('onload', function() {
         alert('loaded');
    })
    .attr("xlink:href", mainscreenURL);

请参阅小提琴:http://jsfiddle.net/dKxH9/

答案 1 :(得分:0)

@nrabinowitz,您的代码无法正常使用。

使用.attr('onload',function(){})在分配'onload'属性期间调用函数,而不是在onload事件期间调用函数。

正确实施应如下(见http://jsfiddle.net/L83nag59/

svg.append("image")
.on('load', function() {
     alert('loaded');
})
.attr("xlink:href", mainscreenURL)

不幸的是,它在IE11中不起作用。