当前位置:首页 > 技术分析 > 正文内容

解决ios15系统的手机使用html2canvas截图页面空白崩溃

ruisui882个月前 (02-25)技术分析11

最近ios15系统推出了,公司的app开始测试ios15的兼容,然后就出现了有截图的页面卡顿白屏的问题。

业务场景是这样,我们的每个页面都会有多个截图,截图使用的方式是html2canvas这个插件,

1、截图方法如下:

// 截图方法
 function convertToPoster() {
   var $poster = $('#poster-content');
   html2canvas($poster[0], {useCORS: true})
     .then(
     function (canvas) {
       var oImage = new Image();
       oImage.src = canvas.toDataURL('image/png', 1);
       $(oImage)
         .addClass('poster');
       $poster.parent()
         .after(oImage)
         .hide();
     }
   );
 };

2、调用方法如下:

$(window).load(function() {
  convertToPoster();
})

3、问题现象:

当页面先截一张图之后,再去截第二张图时,页面就会出现卡顿白屏的问题,这个问题时必现,且在ios的浏览器中走也是这样。

4、解决方案:

经过很多轮的调试之后,依然找不出原因,因为既无报错也不确定页面是在哪行代码卡住的,最终只能采用笨办法,去屏蔽页面的html结构,只留下两个截图的结构,突然好运降临,页面不卡了,截图成功了,那是不是就能证明是页面的某个dom结构导致的呢?

因为页面较为复杂,最终经过10多轮的屏蔽组合,终于确定在了button这里,那么这个button按钮的样式会有什么影响呢?

一步一步挨个去屏蔽属性,结果并没有预料中的变好,正在疑惑之时,突然看到了用户代理样式里面有三个属性是没有替换的,其中有个font-family:system-ui这个样式在chrome浏览器中是没有的,会不会是这个影响的呢?果然屏蔽了它之后就可以了,页面操作无比丝滑。

我们先来看看这个样式究竟是什么意思?

system-ui是一种通用字体系列,它选择当前操作系统下的默认系统字体,它的优势在于和当前系统使用的字体相匹配,可以让Web页面和App风格看起来更统一。

话说它虽然出现得比较晚,但是在can i use上显示的兼容性还是很好的,为啥会出现在ios15的手机系统上呢?目前ios15的资料还少之又少查不到,有待于深究。

记录下目前的处理方案:

//兼容ios15手机系统字体导致的问题
var isiOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
if (isiOS) {
  var ios_ver = parseInt(navigator.userAgent.toLowerCase().match(/cpu iphone os (.*?) like mac os/)[1].replace(/\_/g, '.'));
  if (ios_ver >= 15) {
    if ($('button')) {
      $('button').css('font-family', 'PingFangSC-Regular');
    }
  }
}

版权声明

本文为[青咕咕]所创,转载请带上原文链接,感谢

https://juejin.im/post/7006119499216715783



扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2228.html

分享给朋友:

“解决ios15系统的手机使用html2canvas截图页面空白崩溃” 的相关文章

Vue3,父组件子组件传值,provide(提供)和inject(注入)传值

父组件向子组件传值父子组件传递数据时,通常使用的是props和emit,父向子传递使用props,子向父传递使用emit。子组件接收3种方式// 1、简单接收 props:["title","isShow"], // 2、接收的同时对数据类型进行限制 props:{...

java调用API操作GitLab

最近需要在一个WEB项目中集成GitLab,用到了GitLab的API操作,在网上找了很久都是说直接调用GitLab的Http接口,而且API官方只有javadoc没有其它说明文档,特别记录下,以备查询。这里采用Token的认证方式,因此需要先登陆GitLab新建一个Token,创建方式如下:创建完...

HTML5最新版本介绍

HTML5是HTML4.01和XHTML1.0之后超文本标记语言的最新版本,由一群自由思想者设计,最终实现了多媒体支持、交互性、更智能的表单和更好的语义标注。 HTML 5不只是 HTML规范的最新版本,它是用于生成现代 Web内容的一系列相关技术的总称,其中最重要的三个技术是:HTML5核心规范...

最快清除数组空值?分享 1 段优质 JS 代码片段!

本内容首发于工粽号:程序员大澈,每日分享一段优质代码片段,欢迎关注和投稿!大家好,我是大澈!本文约 600+ 字,整篇阅读约需 1 分钟。今天分享一段优质 JS 代码片段,用最简洁的代码清除了数组中的空值。老规矩,先阅读代码片段并思考,再看代码解析再思考,最后评论区留下你的见解!const arr...

Vue2的16种传参通信方式

前言先直入主题列出有哪些传参方式,下面再通过事例一一讲解。props(父传子)$emit与v-on (子传父)EventBus (兄弟传参).sync与update: (父子双向)v-model (父子双向)ref$children与$parent$attrs与$listeners (爷孙双向)pr...

VUE-router

七.Vue-router1、什么是vue-routervue-router是vue.js官方路由管理器。vue的单页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统页面切换是用超链接a标签进行切换。但vue里是用路由,因为我们用Vue做的都是单页应用,就相当于只有一个主的i...