专栏首页.net core新时代使用html2canvas实现浏览器截图

使用html2canvas实现浏览器截图

  最近做项目为了解决全局异常信息记录,研究了一下浏览器全屏截图功能,方便用户发现异常时能够快速截图发给管理员。最终记录的异常信息如下,上面的【截图报告管理员】就是使用html2canvas前端插件实现的。

阅读目录

回到顶部

html2canvas介绍

以前我们只能通过其他的截图工具来截取图像。现代浏览器的功能已经越来越强,随着H5的逐渐普及,浏览器本身就可以截图啦。html2canvas就是这样一款前端插件,它的原理是将Dom节点在Canvas里边画出来。虽然很方便,但有以下限制:

  • 不支持iframe
  • 不支持跨域图片
  • 不能在浏览器插件中使用
  • 部分浏览器上不支持SVG图片
  • 不支持Flash
  • 不支持古代浏览器和IE,如果你想确认是否支持某个浏览器,可以用它访问 http://deerface.sinaapp.com/ 试试 :)

     由于我的使用场景很简单,记录一下异常信息,并且异常页面也是由自己定义的,那么html2canvas 就足够使用了。

回到顶部

使用实例

   引用jquery,html2canvas即可,使用代码也很简单。我这里使用的是 html2canvas 0.5.0 版本

  html2canvas($("#tbl_exception"), {
         onrendered: function (canvas) {
             var url = canvas.toDataURL();
              //以下代码为下载此图片功能
             var triggerDownload = $("<a>").attr("href", url).attr("download", getNowFormatDate()+"异常信息.png").appendTo("body");
               triggerDownload[0].click();
               triggerDownload.remove();
           }
   });

  第一个参数是要截图的Dom对象,第二个参数时渲染完成后回调的canvas对象。

Name

Type

Default

Description

allowTaint

boolean

false

Whether to allow cross-origin images to taint the canvas

background

string

#fff

Canvas background color, if none is specified in DOM. Set undefined for transparent

height

number

null

Define the heigt of the canvas in pixels. If null, renders with full height of the window.

letterRendering

boolean

false

Whether to render each letter seperately. Necessary ifletter-spacing is used.

logging

boolean

false

Whether to log events in the console.

proxy

string

undefined

Url to the proxy which is to be used for loading cross-origin images. If left empty, cross-origin images won't be loaded.

taintTest

boolean

true

Whether to test each image if it taints the canvas before drawing them

timeout

number

0

Timeout for loading images, in milliseconds. Setting it to 0 will result in no timeout.

width

number

null

Define the width of the canvas in pixels. If null, renders with full width of the window.

useCORS

boolean

false

Whether to attempt to load cross-origin images as CORS served, before reverting back to proxy

回到顶部

问题分析

  介绍完使用之后,说说自己使用中遇到的问题,截图只能截取当前屏幕内的内容。在查看插件源码,进行调试之后找到了解决方案。下面贴出源码和修改后的代码

源码:

    return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function(canvas) {
        if (typeof(options.onrendered) === "function") {
            log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
            options.onrendered(canvas);
        }
        return canvas;
    });

修改代码:

   //2016-02-18修改源码,解决BUG 对于部分不能截屏不能全屏添加自定义宽高的参数以支持
    var width = options.width != null ? options.width : node.ownerDocument.defaultView.innerWidth;
    var height = options.height != null ? options.height : node.ownerDocument.defaultView.innerHeight;
    return renderDocument(node.ownerDocument, options, width, height, index).then(function (canvas) {
        if (typeof(options.onrendered) === "function") {
            log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
            options.onrendered(canvas);
        }
        return canvas;
    });

 主要是让用户调用时能够自定义需要截取Dom对象的宽和高,现在调用方式如下

            $("#btn_screen").on("click", function () {               
                html2canvas($("#tbl_exception"), {
                    height: $("#tbl_exception").outerHeight() + 20,
                    onrendered: function (canvas) {
                        var url = canvas.toDataURL();
                        //以下代码为下载此图片功能
                        var triggerDownload = $("<a>").attr("href", url).attr("download", getNowFormatDate()+"异常信息.png").appendTo("body");
                        triggerDownload[0].click();
                        triggerDownload.remove();
                    }
                });
            });

回到顶部

总结

通过前端插件即实现了浏览器全屏截图功能,不得不说H5功能越来越强大,下面将介绍mvc中的全局异常记录实现。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我的前端学习历程

      很难想象一个半年前还在做后台开发,对前端知之甚少的我,现在也可以从事前端开发了。这半年的学习过程将会是我人生一笔宝贵的财富,这让我想到一句话“在成长的道路上...

    用户1168362
  • 数据字典生成工具之旅(8):SQL查询表的约束默认值等信息

          上一篇代码生成工具里面已经用到了读取表结构的SQL,这篇将更加详细的介绍SQL SERVER常用的几张系统表和视图! 阅读目录 系统表视图介绍 实际...

    用户1168362
  • 性能优化你必须知道的那些事儿

           最近有客户反馈系统导入EXECL进行数据处理超时了,我当时的第一反应,不可能啊我明明是做过性能优化的啊,怎么还会超时呢,这是要有多少条数据才可能发...

    用户1168362
  • Error: inflate() ret

    py3study
  • Oracle 18c体验

    首先Cloud能够登录,通过本地的客户端也是支持的,需要说明的是sql developer需要是18c的版本,12c的版本都不可以。

    jeanron100
  • Yum安装Zabbix4.2.0

    时间:2019-04-09 18:27:53      阅读:824      评论:0      收藏:0      [点我收藏+]

    拓荒者
  • java设计模式之适配器模式,大丈夫能屈能伸

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式有三种:类...

    用户4361942
  • Canvas 进阶(二)写一个生成带logo的二维码npm插件

    在前面的文章有讲到如何用 canvas 画二维码,在此基础上再画一个公司logo,并提供下载的方法供调用,再封装成 npm 插件

    小皮咖
  • leetcode-661-Image Smoother

    chenjx85
  • 数据科学家需要了解的45个回归问题测试题(附答案)

    大数据文摘

扫码关注云+社区

领取腾讯云代金券