html2canvas等待图片加载

时间:2014-07-27 19:13:47

标签: javascript image asynchronous wait html2canvas

我有一段时间没遇到这个问题,我似乎无法找到解决方案。

我正在使用最新的html2canvas js插件截取用flotcharts制作的图表截图,然后通过隐藏输入提交base64截图。问题是图表中的div也有一些图像,html2canvas在加载图像之前返回一个base64字符串。我可以在提交上放置一个setTimeout,直到它们被加载,但显然chrome打开我提交为弹出窗口的页面(这真的不合适,因为我们的客户端不知道如何允许弹出窗口)。 所以这就是我尝试的但图像没有预加载(因为html2canvas的异步性质)

function getPNGBase64forHtml($container) {
    var imageString;

    html2canvas($container, {
        useCORS: true,
        onrendered: function(canvas) {
            imageString = canvas.toDataURL('image/png');
        }
    });

    return imageString;
}

而且这个(这个工作正常,但它没有及时加载图像):

function getPNGBase64forHtml($container) {
    var h2canvas = html2canvas($container);
    var queue = h2canvas.parse();
    var canvas = h2canvas.render(queue);

    return canvas.toDataURL('image/png');
}

所以问题在于等待图像加载到html2canvas中,然后完成其余的东西。 如果有人可以请求帮助,我将非常感激,我向你们示意,我向你们致敬! :)

修改

这是我捕获的部分的html,这一切都在打印容器div中。时间轴中的箭头(只显示一个) - 预测不会被捕获,因为它是一个图像,其他一切都是:

<div id="timeline-outer-container">
    <div id="timeline-container" class="flot-container">
        <div id="timeline-chart" class="flot-chart">
            <canvas class="flot-base" width="888" height="335" ></canvas>
            <div class="flot-text" >
                <div class="flot-x-axis flot-x1-axis xAxis x1Axis">
                    <div class="flot-tick-label tickLabel" >Q1</div>
                    <div class="flot-tick-label tickLabel">Q2</div>
                    ...
                </div>
                <div class="flot-y-axis flot-y1-axis yAxis y1Axis">
                    <div class="flot-tick-label tickLabel">75</div>
                    <div class="flot-tick-label tickLabel">100</div>
                    ...
                </div>
            </div>
            <canvas class="flot-overlay" width="888" height="335"></canvas>
            <div class="axis-label xaxis">Zeitraum</div>
            <div class="axis-label yaxis rotate-90">Anzahl</div>
            <div id="zoom-out-button" class="timeline-zoom-button"><i class="fa fa-zoom-out"></i></div>
            <div id="zoom-in-button" class="timeline-zoom-button"><i class="fa fa-zoom-in"></i></div>
            <div id="zoom-default-button" class="timeline-zoom-button"><i class="fa fa-repeat"></i></div>
        </div>
    </div>
</div>

<div id="timeline-prognose">
    <img id="timeline-arrow-up" class="timeline-arrows" src="/portal//images/arrows/up.png" alt="">
    <img id="timeline-arrow-down" class="timeline-arrows" src="/portal//images/arrows/down.png" alt="">
</div>

1 个答案:

答案 0 :(得分:1)

因此,由于您正在使用遥控器图像,因此您可以使用以下修复程序对脚本进行一些修改:

function getPNGBase64forHtml() {
    var imageString;

    html2canvas(document.body, {
        useCORS: true,
        logging : true, //Enable log (use Web Console for get Errors and Warnings)
        proxy :"html2canvasproxy.php",
        onrendered: function(canvas) {
            var img = new Image();
            img.onload = function() {
                img.onload = null;
                document.body.appendChild(img);
            };

            img.onerror = function() {
                img.onerror = null;
                if(window.console.log) {
                    window.console.log("Not loaded image from canvas.toDataURL");
                } else {
                    alert("Not loaded image from canvas.toDataURL");
                }
            };

            imageString = canvas.toDataURL('image/png');
        }
    });

    return imageString;
}

如果您使用的是php,则代理设置必须使用以下脚本:html2canvas-php-proxy

否则,对于.NET项目,您可以使用以下脚本资源:

html2canvas proxy with asp-classic - vb html2canvas proxy with asp.net - csharp

如果您决定使用本地图像,则不会出现此错误。

希望它适合你,这是这个html2canvas错误的原始主题https://github.com/niklasvh/html2canvas/issues/145