【问题标题】:How to Convert iframe to canvas?如何将 iframe 转换为画布?
【发布时间】:2017-01-28 06:26:57
【问题描述】:

我正在尝试将所有内容作为图像保存到另一个页面中。

我已经探索了这样做的方法,所以我认为我需要先将该页面转换为画布。

所以,我尝试使用要保存的链接,首先将其保存为当前页面中的 iframe,然后将 iframe 转换为画布,但它不起作用。

$(document).ready(function(){

    var element = $("#html-content-holder"); // global variable
    var getCanvas; // global variable

    $("#btn-Preview-Image").on('click', function () {
        html2canvas(element, {
            onrendered: function (canvas) {
                $("#previewImage").append(canvas);
                getCanvas = canvas;
            }
        });
    });

    $("#btn-Convert-Html2Image").on('click', function () {
        var imgageData = getCanvas.toDataURL("image/png");
        // Now browser starts downloading it instead of just showing it
        var newData = imgageData.replace(/^data:image\/png/, "data:application/octet-stream");
        $("#btn-Convert-Html2Image").attr("download", "your_pic_name.png").attr("href", newData);
    });

});
<script src="http://files.codepedia.info/uploads/iScripts/html2canvas.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<iframe id="html-content-holder" width="100%" height="100%" src="http://api.marketanyware.com/chartv2/engine/index.html?{bodyColor:%27#000000',api:{params:[{Stock:'SET',Period:'2hour',ChartList:{OHLC:true,EODHLine:true,EMA: [5, 10, 25, 50, 75, 200],RSI: [7],MACDBar:false,MACD: [{ v12: 12, v26: 26, vref: 9,type:11}/*, { v1: 12, v2: 26, vref: 9}*/],Volume:true,VolumeColor:false}}]}}"></iframe>

<input id="btn-Preview-Image" type="button" value="Preview"/>
<a id="btn-Convert-Html2Image" href="#">Download</a>
<br/>
<h3>Preview :</h3>
<div id="previewImage">

【问题讨论】:

    标签: html canvas iframe html2canvas


    【解决方案1】:

    您无法访问跨域 iframe 的内容。

    html2canvas 也不能,它需要解析 DOM 结构才能在画布上绘制它。

    对于同源 iframe,

    html2canvas 不会自己获取框架的内容,因此您必须将其 contentDocument.documentElement 作为参数传递,否则它只会呈现一个空框。

    frame.onload =()=>{
      html2canvas(frame.contentDocument).then((canvas)=>{
        document.body.appendChild(canvas);
      });
      };
    

    Link for fiddle 因为 stacknippets 框架是沙盒化的,我们无法用它做任何事情......

    【讨论】:

      【解决方案2】:

      试试这个:

      var element = $(document.querySelector("#iframe-id")).contents().find('body')[0];
              html2canvas(element).then(canvas => {
                      document.body.appendChild(canvas)
                  });
      

      【讨论】:

      • 什么是'$'?我得到的内容不是函数。
      • @smartblonde '$' 指的是jquery。几年前,它在网络上很流行。现代 Web 开发越来越少地使用它。如果页面上没有此特定示例,它将无法工作。
      猜你喜欢
      • 2017-09-08
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2012-04-10
      • 2014-04-14
      相关资源
      最近更新 更多