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录制屏幕,然后播放视屏的方法。

javascript实现当前页面截屏的更多相关文章

  1. Android 使用WebView加载含有Canvas的页面截屏处理

    无法截屏主要原因是webview渲染方式所导致:只需要AndroidManifest.xml中设置属性Android:hardwareAccelerated=”false”.

  2. Android 获取浏览器当前分享页面的截屏

    Android 获取浏览器当前分享页面的截屏 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/BrowserScreenShotActivity 文中 ...

  3. android手机截屏、录屏

    1. 手动截屏,通过其他第三方软件发送截图,或者从手机取出截图 2. 使用命令截图,将截图保存到手机,再拉取到电脑 #!/bin/sh #运行 sh screenshot name picName=$ ...

  4. pytest框架优化——将异常截屏图片加入到allure报告中

    痛点分析: 在做allure定制化的时候,关于附件添加这一块,我们在代码里可以添加我们准备好的附件,这里用图片,通过下面的方法就能实现 allure.attach(file, '图片描述', allu ...

  5. 搭建前端监控系统(六)JS截屏和录屏篇

    怎样定位前端线上问题,一直以来,都是很头疼的问题,因为它发生于用户的一系列操作之后.错误的原因可能源于机型,网络环境,接口请求,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决 ...

  6. 使用 JavaScript 截屏

    经常在微博上看到很多内容使用的什么长微博截图,并且截图上还附加了很多其他的信息.之前对纯前端截图有些研究,正好本博客有这个需求,今天就把这东西实现了下. 需要声明的是,JavaScript 目前还不能 ...

  7. php结合phantomjs实现网页截屏、抓取js渲染的页面

    首先PhantomJS快速入门 PhantomJS是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, ...

  8. Javascript网页截屏的方法

    最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...

  9. asp.net截屏功能实现截取web页面

    using System.Drawing;  //打开该页面 System.Diagnostics.Process.Start("IEXPLORE.EXE", "http ...

随机推荐

  1. javaWeb中 servlet 、request 、response

    1.Servlet (1)Servlet是JavaEE的一个动态web资源开发技 术,就是在服务器上运行的小程序,这个小程序是由服务器调用的,服务器为了能调用这个小程序,就要求这样的程序必须实现一个S ...

  2. 使用 Box2D 做一个 JansenWalker 机器人

    在 Box2DFlash 的官网的首页有一个小 Demo,这个 Demo 中有11个例子,可以通过左右方向键查看不同的例子,里面的每个例子都非常有趣,但最让我感兴趣的,是其中一个叫 JansenWal ...

  3. css中各种情况下的元素的垂直和水平居中的问题

    问题:外边是一个容器,容器中还有一个容器,那么请问怎么让里边的容器垂直水平居中显示?? No1: 外边的容器宽度和高度确认,里边是行内元素 .container{width:200px; height ...

  4. poj 3734 Blocks

    ゲート 分析:这题过的人好多,然后大家好像是用矩阵过的(((φ(◎ロ◎;)φ))).我自己是推公式的. 对于任意的有这个式子, 就是先从里面选偶数个涂成两个指定的颜色,再在选出的里面选定涂某种颜色,选 ...

  5. python 函数传递参数的多种方法

    python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...

  6. Apache多端口监听

    打开:config/httpd.conf 找到Listen 80 在下面增加你要监听的端口,修改后如下: Listen 80 Listen 81 重启apache服务器

  7. hibernate入门实例

    1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ...

  8. 使用 WinHttp 实现文件下载

    #include <Windows.h> #include <Winhttp.h> #pragma comment(lib,"Winhttp.lib") t ...

  9. C++ 类、构造析构、深拷贝

    1st,感性理解类的思想,就是把数据和对数据的操作打包在一块儿,设计类的时候要 想好数据部分和 要进行的操作.以下是时间类的示意,时间包含时分秒,Time为构造函数,该类支持的操作就是设置时间和读取时 ...

  10. Paths_Quartz2D

    Paths中的几个重要元素 Points void CGContextMoveToPoint (    CGContextRef c,    CGFloat x,    CGFloat y ); 指定 ...