• javascript实现当前页面截屏


    javascript实现当前页面截屏

    一、前言

    有客户要求能对用户当前页面进行指定区域截屏,类似qq截屏的实现效果。比如用户在处理工作的时候,将当前页面录入后的一些信息进行截图下载保存。但又不能安装任何客户端控件,只能用javascript实现.网上搜索了一下,没有可用的方案(http://www.2cto.com/kf/201301/184453.html,这个虽然提供了方法,但是在实际使用中无法满足,例如支持低版本的IE,支持内嵌的iframe截图)。但是也找到了一些可能的思路,经过几天奋战,终于完成一个可用的javascript截屏思路。因为是javascript,所以还是会有一些限制,例如只能在页面内截屏,截屏范围不能超出当前页面等。还好这些是客户没有要求的。

    二、演示地址及说明

    下面是效果图和演示地址。

    (不好意思,本来打算提供演示地址,因为一些原因暂时无法提供,以后能提供的时候再把地址写上)

    登陆进去后,点击页面顶部的 打开截屏控制器 按钮,然后在点击 截屏 按钮,这时候整个页面处于截屏状态,按下鼠标左键并移动鼠标,画出截屏区域,然后双击截屏区域就可将当前区域保存为图片下载。

    三、实现思路及主要问题

    因为系统中集成的代码比较多,所以无法直接贴出源代码,这里只给出具体的思路,和实现过程中遇到的难点问题并给出难点问题的一些参考代码。

    具体的思路其实不难,需要有服务器端的配合,这里的服务器使用asp.net。主要有以下几个步骤:

    1、获取当前页面dom的html保存。

    2、将html代码发送到服务器

    3、在服务器端使用浏览器对象重新载入代码,还原用户当时的页面状态

    4、使用浏览器对象的生成图片功能生成图片

    上面是总体的思路,在实现的过程中需要注意一些细节问题。

    1、第一个问题就是获取当前用户页面的dom的html。对于IE来说,使用outerHTML就可以了,但是对于非IE浏览器,使用outerHTML无法获取用户做过修改的内容。这里就需要做一下修改。在jquery中,有一个.html()方法,这个方法返回的是innerHTML,估计jquery内部也是用了浏览器本身的innerHTML方法,所以这个.html()也无法获取用户修改后的页面dom代码。下面代码就是对.html()方法做一些修改,已支持获取用户修改后的内容。

    (function ($) {

            var oldHTML = $.fn.html;

     

            $.fn. newhtml = function () {

                if (arguments.length) return oldHTML.apply(this, arguments);

                $("input,,button", this).each(function () {

                    this.setAttribute('value', this.value);

                });

                $(":radio,:checkbox", this).each(function () {

                    if (this.checked) this.setAttribute('checked', 'checked');

                    else this.removeAttribute('checked');

                });

                $("option", this).each(function () {

                    if (this.selected) this.setAttribute('selected', 'selected');

                    else this.removeAttribute('selected');

                });

                $("textarea", this).each(function () {

                    this.innerHTML = this.value;

                });

                return oldHTML.apply(this);

            };

        })(jQuery);

    }

    2、第二个问题就是服务器的浏览器对象,在asp.net中,我们可以使用System.Windows.Forms

     .WebBrowser这个对象。为了能在asp.net中使用这个对象,.aspx页面的Page标签内必须使用 AspCompat="true"属性,否则会出错。这方面的代码网上有很多,这里就不在贴代码了,大家自行google就可以了。

    剩下的就是具体实现的小问题,比如要记录当前截屏区的位置和大小等等。

    有了以上的实现思路,我们还可以做很多其他的工作。例如将页面指定的控件另存的图片,这个功能有很多用处,比如有一个web页面的统计报表,但是客户需要的是一个图片形式的,或者pdf,或者word格式的文档,我们就可以利用这种方法,将指定控件的内容生成图片,然后在服务器端生成pdf或者word,将图片插入即可。

    四、缺点

    这种方法因为是在服务器端重现用户当时的页面信息,尽量还原当时的状态,但并不能做到完全一致,因为页面的状态信息是无法在服务器端完全复制和还原的。比如,客户端的一些activeX控件无法再服务器端重新,如果客户端是非IE浏览器,截屏的效果可能和实际效果不同(当然如果您访问的页面已经做了浏览器兼容,在不同浏览器访问时效果一样,那么也就不会有问题了),因为服务器端的浏览器(我们用的是window平台技术)是IE。

    五、后续

    本章介绍了截屏的基本原理和实现思路,下面两章讲一讲另存页面或者页面内指定控件内容为图片,以及使用javascript录制屏幕,然后播放视屏的方法。

  • 相关阅读:
    VC笔记
    安卓开发,调用系统相册或相机选择图片
    安卓gradle时报错"ERROR: Plugin with id 'com.android.application' not found."
    安卓开发 利用百度识图api进行物体识别(java版)
    安卓使用讯飞SDK
    《构建之法》读书笔记1
    安卓开发 利用百度识图api进行物体识别
    安卓使用讯飞sdk报错
    Android webview学习
    open failed: EACCES (Permission denied)
  • 原文地址:https://www.cnblogs.com/chegan/p/3836330.html
Copyright © 2020-2023  润新知