分享

javascript实现当前页面截屏

 quasiceo 2015-01-12
javascript实现当前页面截屏

javascript实现当前页面截屏

一、前言

有客户要求能对用户当前页面进行指定区域截屏,类似qq截屏的实现效果。比如用户在处理工作的时候,将当前页面录入后的一些信息进行截图下载保存。但又不能安装任何客户端控件,只能用javascript实现.网上搜索了一下,没有可用的方案(http://www./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录制屏幕,然后播放视屏的方法。

 

 

 

========================================================

比sharepoint更强大的表单功能,图形化的流程设计,与asp.net完美结合,支持vs.net编程扩展

========================================================

posted on 2014-07-10 18:05 chegan 阅读(1430) 评论(6) 编辑 收藏

评论

#1楼  2014-07-10 20:51 Li Qian  

    回复引用

#2楼[楼主2014-07-10 22:03 chegan  

@Li Qian
获取当前页面dom的html保存。这里指的是会获取当前页面的<html>...</html>的所有部分,当然也包含css。然后重新再服务器上还原代码。
    回复引用

#3楼  2014-07-11 20:37 moka  

页面如果是自己做的还好些,非ie可以用html2canvas做截屏
    回复引用

#4楼  2014-07-13 09:42 Li Qian  

@chegan
请问怎么做还原呢?
    回复引用

#5楼[楼主2014-07-14 15:13 chegan  

@Li Qian
就是把客户端获取的当页面动态的innerHTML返回到服务器,然后在服务器生成一个临时的html文件,然后再用WebBrowser访问这个临时文件。
    回复引用

#6楼[楼主2014-07-14 15:14 chegan  

@moka
是的,页面时自己做的比较好处理。
    回复引用

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多