html5使用html2canvas实现浏览器截图的示例


Posted in HTML / CSS onAugust 31, 2017

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

html5使用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功能越来越强大,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。
 

HTML / CSS 相关文章推荐
HTML5时代CSS设置漂亮字体取代图片
Sep 04 HTML / CSS
CSS3实现复选框动画特效示例代码
Sep 27 HTML / CSS
CSS3实现瀑布流布局与无限加载图片相册的实例代码
Dec 22 HTML / CSS
css3一个简易的 LED 数字时钟实现方法
Jan 15 HTML / CSS
CSS 3.0文字悬停跳动特效代码
Oct 26 HTML / CSS
关于css中margin的值和垂直外边距重叠问题
Oct 27 HTML / CSS
如何使用localstorage代替cookie实现跨域共享数据问题
Apr 18 HTML / CSS
用html5实现语音搜索框的方法
Mar 18 HTML / CSS
HTML5中判断用户是否正在浏览页面的方法
May 03 HTML / CSS
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
Sep 19 HTML / CSS
HTML5中外部浏览器唤起微信分享功能的代码
Sep 15 HTML / CSS
纯CSS实现hover图片pop-out弹出效果的实例代码
Apr 16 HTML / CSS
前端面试必备之html5的新特性
Sep 05 #HTML / CSS
html5仿支付宝密码框的实现代码
Sep 06 #HTML / CSS
HTML5 本地存储实现购物车功能
Sep 07 #HTML / CSS
HTML5 FormData 方法介绍以及实现文件上传示例
Sep 12 #HTML / CSS
html5自带表单验证体验优化及提示气泡修改功能
Sep 12 #HTML / CSS
html5利用canvas绘画二级树形结构图的示例
Sep 27 #HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
Dec 13 #HTML / CSS
You might like
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
JS的千分位算法实现思路
2013/07/31 Javascript
extjs render 用法介绍
2013/09/11 Javascript
JS中操作JSON总结
2020/12/06 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
js获取Get值的方法
2016/09/29 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
python入门之基础语法学习笔记
2020/02/08 Python
Python @property原理解析和用法实例
2020/02/11 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
初中生个人学习的自我评价
2013/12/04 职场文书
环保建议书200字
2014/05/14 职场文书
机械系毕业生求职信
2014/05/28 职场文书
家庭教育的心得体会
2014/09/01 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
户外亲子活动总结
2015/05/08 职场文书
中秋节随笔
2015/08/15 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL