【问题标题】:SVG images doesn't appear on IE 11SVG 图像不会出现在 IE 11 上
【发布时间】:2015-01-03 01:30:35
【问题描述】:

我要做的是在 img 源中简单地加载 SVG,以便稍后在我的画布上绘制它。这在所有现代浏览器甚至 IE 9、10 中都可以正常工作,但在 IE 11 中却不行。当我仔细观察时,它仍然会调用“onload”,但不会加载任何宽度和高度为零的内容。这是一个非常简单的示例,它从 wiki 加载一些 SVG 图像并在 div 中打印它的大小:

var imgObj = new Image();

imgObj.onload = function(){
    $("#output").html(imgObj.width);
};

imgObj.src = 'https://upload.wikimedia.org/wikipedia/commons/1/15/Svg.svg';

https://jsfiddle.net/zmLtrbr9/

现在,如果我在画布上绘制此图像,它将不会显示。

【问题讨论】:

    标签: javascript html internet-explorer svg html5-canvas


    【解决方案1】:

    您的问题似乎不是图像没有出现,而是没有 width 与 SVG <img> 对象关联。现在,我无法说规范方面是否有意义,但我确实找到了一个简单的解决方法,唯一(大)缺点是它需要在 DOM 中包含 <img>

    首先我们创建一个隐藏的div:

    var hiddenDiv = document.createElement("div");
    hiddenDiv.classList.add("hidden"); 
    

    .hidden 定义为

    .hidden{
        overflow:hidden;
        width:0px;
        height:0px;
    }
    

    接下来我们创建 <img> 并将其包含在 DOM 中

    var imgObj = document.createElement('img'); //Note, new Image() is an artifact from
                                                // older times and synonymous for this
    hiddenDiv.appendChild(imgObj);
    document.body.appendChild(hiddenDiv);
    

    最终再次完成您的代码(没有 jQuery,因为您没有标记您的问题)

    imgObj.onload = function(){
        document.querySelector("#output").textContent = imgObj.width;
    };
    imgObj.src = 'https://upload.wikimedia.org/wikipedia/commons/1/15/Svg.svg';
    

    var hiddenDiv = document.createElement("div");
    hiddenDiv.classList.add("hidden");
    
    var imgObj = document.createElement('img');
    hiddenDiv.appendChild(imgObj);
    document.body.appendChild(hiddenDiv);
    
    imgObj.onload = function(){
        document.querySelector("#output").textContent = imgObj.width;
    };
    imgObj.src = 'https://upload.wikimedia.org/wikipedia/commons/1/15/Svg.svg';
    .hidden{
        overflow:hidden;
        width:0px;
        height:0px;
    }
    <div id="output"></div>

    【讨论】:

    • 感谢您的回答,大卫!遗憾的是,此修复程序不适用于我的图像,因为有时(5/10)它返回错误的 svg 大小。不是 (0,0),而是比实际尺寸小 10 倍的东西。例如,得到 (980, 622) 它有时会返回 (28, 30)。我通过在 onload 处理程序中处理图像大小之前添加小超时神奇地解决了这个问题。因此,如果有人在这里遇到同样的问题是简单的解决方案:imgObj.onload = function(){ setTimeout(function(){ document.querySelector("#output").textContent = imgObj.width; }, 300); };
    猜你喜欢
    • 2017-06-09
    • 2019-05-02
    • 1970-01-01
    • 2012-12-29
    • 2016-03-31
    • 2018-12-20
    • 2013-11-21
    • 2023-03-03
    • 2014-05-19
    相关资源
    最近更新 更多