html2canvas.js使用过程中在ios下遇到的bug——背景音乐重复播放

本文主要是介绍html2canvas.js使用过程中在ios下遇到的bug——背景音乐重复播放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇文章中已经介绍了其中遇到的一个bug——截图不完整,点击打开链接。

这篇文章给大家说一下在使用html2canvas截图时,遇到的另一个bug,背景音乐在IOS11下会重复播放的问题!

(说明:项目是移动端项目,只限IOS11及以上系统,若是PC端、安卓bug、IOS10/9/8,请对比参考)

遇到此问题的时候,实在很无语,因为IOS11刚刚出来,在网上搜索有关bug的文章实在没有,又不得不用html2canvas,今日就把工作中遇到的问题给大家分享一下。

首先说一下html2canvas的工作原理

Html2canvas加载后将会浏览页面上的所有元素,集合所有页面元素的信息,然后用户就可以通过Html2canvas把整个页面(整屏)截图下来。
换句话来说,Html2canvas不会实际上的截图,而是通过从DOM读取的足够信息去建立一个页面的展示镜像,生成base64的图片流程。
这就会导致Html2canvas只会渲染它认识的正确的DOM元素属性,还有很多CSS属性是不会生效的,也就渲染不出来了。

使用方法

html2canvas(element, options);
html2canvas(element, {onrendered: function(canvas) {// canvas 是最后一个渲染的<canvas> 元素}
});
个人分析在IOS11下背景音乐在调用Html2canvas()会重复播放,说明背景音乐在Html2canvas从DOM读取信息渲染成图片时,背景音乐在已有的播放音乐没有停止的情况下,又重复加载了一次,所以想到的解决方法就是在Html2canvas()在调用时,背景音乐不自动播放,不管想的原理对不对,但是这样还真解决的问题,代码附上,供大家参考一下。

//解决ios11下,重复加载背景音乐的bug
function iosMusic(){var agent = navigator.userAgent.toLowerCase() ;//判断手机系统// console.log(agent);var version;if(agent.indexOf("like mac os x") > 0){//iosvar regStr_saf = /os [\d._]*/gi ;var verinfo = agent.match(regStr_saf) ;version = (verinfo+"").replace(/[^0-9|_.]/ig,"").replace(/_/ig,".");//获取具体的系统版本号console.log(version)var typeNum = version.split(".")[0];//获取系统版本号的第一位数字console.log(typeNum)if(typeNum >= 11){$("#myaudio").removeAttr("autoplay");}}
}

这里用了一个手机系统的判断,最重要的一句话是给背景音乐删除自动播放的属性

$("#myaudio").removeAttr("autoplay");

然后调用html2canvas时,引用此函数


为什么在IOS11下背景音乐会重复播放,这个究竟是IOS11系统的兼容问题,还是html2canvas插件的问题,小学生没有太多研究,望大神给指点,目前只是个人碰到的问题与解决的方法,与同行们分享一下!前端道路深似海,与大家共奋进!

本人项目链接地址参考:点击打开链接

声明:转载请注明出处,谢谢!

这篇关于html2canvas.js使用过程中在ios下遇到的bug——背景音乐重复播放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/569674

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash