简体   繁体   English

html2canvas等待图像加载

[英]html2canvas wait for images to load

I'm having this problem for some time ow and I can't seem to find a solution. 我有一段时间了这个问题,我似乎找不到解决办法。

I'm using the latest html2canvas js plugin to take a screenshot of chart made with flotcharts and then submit the base64 screenshot via a hidden input. 我正在使用最新的html2canvas js插件来拍摄用flotcharts绘制的图表的屏幕截图,然后通过隐藏的输入提交base64屏幕截图。 The problem is the div with the chart also has some images and html2canvas return a base64 string before the images are loaded. 问题是图表的div也有一些图像,并且html2canvas在图像加载前返回了base64字符串。 I can put a setTimeout on the submit untill they are loaded but apparently chrome opens the page where I submitted as a popup (which is really not ok cause our clients don't know how allow popups). 我可以将setTimeout放在提交上,直到它们加载完毕,但显然chrome打开我提交的页面作为弹出窗口(这真的不行,因为我们的客户不知道如何允许弹出窗口)。 So this is what I tried but the images are not preloaded (because of the async nature of html2canvas) 所以这就是我尝试过的,但是图像没有预加载(由于html2canvas的异步特性)

function getPNGBase64forHtml($container) {
    var imageString;

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

    return imageString;
}

And also this (this works ok but it doesn't load the images in time): 而且这(这可以,但是不能及时加载图像):

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

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

So the problem is with waiting till the images are loaded in html2canvas then exeuting the rest of my stuff. 因此,问题在于等待图像加载到html2canvas中,然后执行其余的东西。 If anyone can please help, that would be very much appreciated, I bow to you kind sirs and madams! 如果有人可以帮助,将不胜感激,我向您致敬的先生和女士们! :) :)

Edit : 编辑

Here is the html of the part that I capture, this all is in a print-container div thats all. 这是我捕获的部分的html,所有这些都在打印容器div中。 The arrow (only one is showed) in the timeline-prognose doesn't get captured cause it's a image, everything else does: 时间轴预测中的箭头(仅显示一个)没有被捕获,因为它是图像,其他所有操作都可以:

<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>

So since you're using remotes images you can use the following fix doing some modifications in your script: 因此,由于您使用的是远程图像,因此可以使用以下修复程序在脚本中进行一些修改:

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;
}

If you are using php then the proxy setting must use the following script: html2canvas-php-proxy 如果您使用的是php,则代理设置必须使用以下脚本: html2canvas-php-proxy

Otherwise with .NET projects you can use these script resources: 否则,对于.NET项目,您可以使用以下脚本资源:

html2canvas proxy with asp-classic - vb html2canvas proxy with asp.net - csharp 带有asp-classic的 html2canvas代理-vb带有asp.net的html2canvas代理-csharp

If you decided to use local images this bug will not appear. 如果您决定使用本地图像,则不会出现此错误。

Hope it works for you, here is the original thread for this html2canvas bug https://github.com/niklasvh/html2canvas/issues/145 希望它对您有用,这是此html2canvas错误的原始线程https://github.com/niklasvh/html2canvas/issues/145

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM