html2canvas 等待图像加载

2023-12-19

我遇到这个问题已经有一段时间了,但我似乎找不到解决方案。

我正在使用最新的 html2canvas js 插件来截取使用 fllotcharts 制作的图表的屏幕截图,然后通过隐藏输入提交 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 中然后执行我的其余部分。 如果有人能提供帮助,我将不胜感激,我向善良的先生们、女士们鞠躬! :)

Edit:

这是我捕获的部分的 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>

因此,由于您使用的是远程图像,您可以使用以下修复程序在脚本中进行一些修改:

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-代理 https://github.com/brcontainer/html2canvas-php-proxy

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

html2canvas 代理与 asp-classic - vb https://github.com/brcontainer/html2canvas-asp-vbscript-proxy html2canvas 代理与 asp.net - csharp https://github.com/brcontainer/html2canvas-csharp-proxy

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

希望它对你有用,这是这个 html2canvas bug 的原始线程https://github.com/niklasvh/html2canvas/issues/145 https://github.com/niklasvh/html2canvas/issues/145

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

html2canvas 等待图像加载 的相关文章

随机推荐

  • 使用 ASP.NET MVC 设置路由 {tenant}/{controller}/{action}/{id}?

    我想设置一个多租户 ASP NET MVC 应用程序 理想情况下 这个应用程序应该有一条路线 tenant controller action id each tenant代表应用程序的逻辑实例 简单地独立的多用户帐户 我仍然不清楚具体的细
  • Vuetify / DataTable:更改“显示分组依据”按钮的样式?

    我想使用 vuetify 数据表中的默认分组功能 它工作正常 但我想更改分组的默认按钮样式并将其替换为图标 那可能吗 如果我检查开发工具中的按钮 它只会显示 span group span 在文档中只找到这个 https vuetifyjs
  • 使用 FIRST_VALUE 而不在分组依据中包含内部列

    我正在使用一个看起来像这样的表 userID eventDate eventName 1 2019 01 01 buySoup 2 2019 01 01 buyEggs 2 2019 01 03 buyMilk 2 2019 01 04 b
  • 如何使用 rstanarm 以 APA 风格报告贝叶斯线性(混合)模型?

    我目前正在努力解决如何按照 APA 6 建议报告输出的问题rstanarm stan lmer 首先 我将在频率论方法中拟合混合模型 然后尝试使用贝叶斯框架执行相同的操作 这是获取数据的可重现代码 library tidyverse lib
  • 如何添加Voronoi图?

    我想向我的集群添加 Voronoi 图 也就是说 我想要一张包含我的簇 质心 Voronoi 区域的图 有简单的方法吗 I tried x lt c 4 7 9 2 3 3 7 7 8 8 9 9 y lt c 6 3 3 6 5 7 2
  • Symfony2 从表中删除记录

    我的树枝上有一个按钮 我希望能够使用它从表中删除记录 当我点击删除按钮时 页面会重新加载 但不会删除任何记录 这是我的树枝 h1 Admin Area The football blog h1 table class zebra thead
  • 当 JSpinner 失去焦点时用户输入无效值时如何“注意/陷阱”

    这是 SSCCE 对我之前问题的延续 上一个问题 https stackoverflow com questions 20902932 how to check manual edits on a jspinner field using
  • 编辑复制到剪贴板的LMC按钮

    我有一些问题LMC 按钮 http www lettersmarket com view blog a 3 copy to clipboard lmcbutton html因为它的编码方式 ShowLMCButton Copied Text
  • PostgreSQL JDBC getGenerateKeys 返回所有列

    我最近在一个项目的后端从 MySQL 切换到 PostgreSQL 并发现我的一些数据库代理方法需要审查 为了插入链接的对象 我使用事务来确保存储所有内容 我使用 jdbc 方法执行此操作 例如setAutoCommit false and
  • 未找到符号。 Collect2:ID 返回 1 退出状态

    我收到以下错误 Undefined symbols OBJC CLASS SurveyDelegate referenced from objc class ref to SurveyDelegate in Menus o ld symbo
  • 如何使用存储为 CSV 的矢量数据在 mahout 中执行 k 均值聚类?

    我有一个包含数据向量的文件 其中每行包含一个以逗号分隔的值列表 我想知道如何使用 mahout 对这些数据执行 k 均值聚类 wiki 中提供的示例提到了创建sequenceFiles 但除此之外 我不确定是否需要进行某种类型的转换才能获取
  • 使用 C# 检测文件名字符是否被视为国际字符

    我编写了一个小型控制台应用程序 下面的源代码 来定位并选择性地重命名包含国际字符的文件 因为它们是大多数源代码控制系统持续痛苦的根源 下面有一些背景知识 我使用的代码有一个简单的字典 其中包含要查找和替换的字符 并删除使用超过一个存储字节的
  • SQL Server 2012:如何将所有数据库存储过程编写成单独的 .sql 文件?

    我想编写从 SQL Server 2012 到 Visual Studio 2012 的所有存储过程的脚本 sql文件 在不同的项目中 我怎么做 我想要每个存储过程都有一个 sql 文件吗 在 SQL Server 2012 中右键单击 D
  • 为什么我的谓词没有回溯?

    我不明白为什么我的谓词不回溯并找到所有解决方案 person john person erik allExceptSpider person Spider T setof person X person X S subtract S per
  • 使用铯最轻的方法是什么?

    我有兴趣使用 Cesium 构建带有自定义图块的 3D 地球 但根据此处为 开始 说明 http cesiumjs org 2013 04 12 Cesium up and running 似乎您必须下载一个巨大的 30mb 目录并将整个内
  • Thymeleaf 选择选项性能问题

    我最近一直在摆弄 Spring MVC 5 和 Thymeleaf 3 0 并注意到一些奇怪的事情 我已经开始根据网站上的教程实现下拉列表 并注意到一些性能问题 如果我使用以下代码 我的页面大约需要 5 5 秒才能呈现大约 100 个项目的
  • android 滑动层activity动画

    我想实现滑动层动画以进行活动转换 如材料设计指南中所述 然而 我现在所能做的就是将 slip in 和保持动画简单组合起来 这不会给我带来堆叠层的效果 我怎样才能实现它 我目前的实施 活动开始时 activity overridePendi
  • 如何在SSIS包中设置变量?

    我需要在我的 SSIS 包中使用两个变量 extract beg date and extract end date 我如何设置它们以某种方式行事 例如 在存储过程中 它看起来像这样 SET extract beg date CASE WH
  • 如何在使用 XmlHttpRequest 和 FormData 时设置边界

    我试图在使用 FormData 发布 XmlHttpRequest 时在标头中正确设置边界 xhr open POST url xhr setRequestHeader Content type multipart form data bo
  • html2canvas 等待图像加载

    我遇到这个问题已经有一段时间了 但我似乎找不到解决方案 我正在使用最新的 html2canvas js 插件来截取使用 fllotcharts 制作的图表的屏幕截图 然后通过隐藏输入提交 base64 屏幕截图 问题是带有图表的 div 也