【问题标题】:Check successful loading of pixel image in svg检查 svg 中像素图像的成功加载
【发布时间】:2017-04-03 19:34:26
【问题描述】:

使用 javascript,我通过在循环中将 <image id="myimage" xlink:href="mysource.png" ... /> 元素从 XMLdoc 移动到 SVG 图像的 DOM 来添加许多像素图像,就像这样

var elems = this.XMLdoc.getElementsByTagName('image');
var elem = elems.item(0);
svg.appendChild(elem);

由于网络问题或服务器限制,有时并非所有图像都已完全加载。 加载完所有图片后,我想检查一下是否成功,如果没有,重新加载像素图mysource.png

我可以删除并重新添加所有<image> 标签并依赖缓存的图像已成功加载,但我仍然不知道是否所有图像都在第二轮中加载。

如果它包含在 html 中的 <img> 中,我会通过检查 image.complete 来做到这一点,但这似乎不适用于 SVG 图像。

我还使用 Snap.svg 来操作 SVG。如果有帮助的话,基于这个库的解决方案会很方便。

【问题讨论】:

    标签: javascript html image svg


    【解决方案1】:

    在 SVG 中你通过load 事件监听加载事件,你可以这样做:

    var elems = this.XMLdoc.getElementsByTagName('image');
    var elem = elems.item(0);
    elem.addEventListener("error", replaceImage);
    svg.appendChild(elem);
    
    function replaceImage(e){
       var parent = this.parentNode;
       var newImage = this.cloneNode();
       newImage.addEventListener("error", replaceImage);
       parent.removeChild(this);
       parent.appendChild(newImage);
    }
    

    【讨论】:

    • 好的,假设 Snap.svg 不干扰,您将构建一个包含所有元素的数组,并在它们的加载事件触发后将它们逐个删除?请记住,我需要知道未加载的元素!
    • 两者似乎都适用于 chrome。是否有一种聪明的方法来更新 SVG 图像,使其尝试再次加载像素图形(除了更改源或删除标签并重新添加)?
    • 收听error 应该可以。您通常不会进行这种错误检查,但如果您担心,只需在错误回调中添加 alert("there was a problem loading an image, please reload the page)
    • 不幸的是,这不是一个解决方案。 svg 中有数百个缩略图。主要是服务器的限制性规则,也因为网络问题,很多都没有立即加载。用户需要重新加载十几次才能拥有所有内容。
    • 我已经改变了我的答案,它应该只是作为一个指导,因为这些情况很难复制。假设有网络问题,它会无限循环。
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2011-05-20
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多