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

non*_*ont 5 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)
}); 
Run Code Online (Sandbox Code Playgroud)

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

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

在图像满载时,是否有任何可以挂钩的事件?

nra*_*itz 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);
Run Code Online (Sandbox Code Playgroud)

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

  • 有趣的是,图像有时已经在浏览器中,因此 onload 并不总是被调用。还有哪些其他活动?你能指出你在哪里找到这个的吗?(或者你只是猜测并尝试一下!?)编辑:在这里找到它们:http://www.w3.org/TR/SVG/interact.html#SVGEvents (2认同)