前端实现录屏、跨页面录屏、截屏功能


录屏实现方案:rrweb.js
官方文档:https://github.com/rrweb-io/rrweb

截屏实现方案:html2canvas.js

官方文档:http://html2canvas.hertzen.com/

rrweb录屏实现的原理是记录dom的变化,播放的时候重新执行dom操作,所以不支持生成mp4,只可以在web端重放

html2canvas截图实现的原理是生成一个canvas画布,画布的内容是插件帮我们实现好的,我们需要做的是将canvas画布保存成base64图片,保存到本地或者上传

服务端例子:express

需要引入的文件:

rrweb:




html2canvas(从官网下载到本地的文件)

下面用一个例子演示一下跨页面录屏和截屏的效果

前端完整代码如下:

页面1:



  
    
    
    
    
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/rrweb@latest/dist/rrweb.min.css"
    />
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/rrweb-player@latest/dist/style.css"
    />
  
  
    
    
    
    
    
    
    
    
    
    
    

this is page1

页面2:



  
    
    
    
    
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/rrweb@latest/dist/rrweb.min.css"
    />
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/rrweb-player@latest/dist/style.css"
    />
  
  
    
    
    
    
    
    
    
    
    

this is page2

服务端代码:

/*
 * @Author: your name
 * @Date: 2020-07-18 19:09:47
 * @LastEditTime: 2020-07-19 12:24:16
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /record-2/app.js
 */ 
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var fs = require('fs');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var bodyParser = require('body-parser');
var app = express();

app.use(bodyParser.urlencoded({
  extended:true
}));
let events = [];
// view engine setup
app.use(express.static(path.join(__dirname, 'public')));
// 服务端页面
app.get('/', function(req, res, next) {
    // res.writeHead(200,{'Content-Type':'text/html'})
    fs.readFile('./html/index.html','utf-8',function(err,data){
        if(err){
        throw err ;
        }
        res.send(data);
        });
});
app.get('/page2.html', function(req, res, next) {
  // res.writeHead(200,{'Content-Type':'text/html'})
  fs.readFile('./html/page2.html','utf-8',function(err,data){
      if(err){
      throw err ;
      }
      res.send(data);
      });
});
app.post('/clearEvents',function(req, res, next) {
  // res.writeHead(200,{'Content-Type':'text/html'})
  console.log(req.body)
  events = [];
  res.send({msg:"操作成功"})
  // if(req.query.events.length>0){
  //   res.send({state:1,msg:"上传成功"})
  // }else{
  //   res.send({state:0,msg:"参数错误,未获取到录屏信息"})
  // }
});
//
app.post('/saveEvents',function(req, res, next) {
  // res.writeHead(200,{'Content-Type':'text/html'})
  console.log(req.body)
  res.send({state:1,msg:"上传成功"})
  // res.send(req.body.events)
  if(req.body.page==1){
    events = []
  }
  events = events.concat(JSON.parse(req.body.events))
  fs.writeFile("./data.txt",JSON.stringify(req.body.events),'utf-8',function(){
    
  })
  // if(req.query.events.length>0){
  //   res.send({state:1,msg:"上传成功"})
  // }else{
  //   res.send({state:0,msg:"参数错误,未获取到录屏信息"})
  // }
});
//
app.post('/getEvents',function(req, res, next) {
  res.send(events);
  // fs.readFile('./data.txt','utf-8',function(err,data){
  //   if(err){
  //     throw err ;
  //   }
  //   console.log(JSON.parse(data))
  //   res.send(data);
  // });
  // if(req.query.events.length>0){
  //   res.send({state:1,msg:"上传成功"})
  // }else{
  //   res.send({state:0,msg:"参数错误,未获取到录屏信息"})
  // }
});

module.exports = app;

上面的例子如果只想在前端看效果的话,只运行第一个页面的前端代码也能查看。