• 移动端H5开发问题(html2canvas、video、audio)


    此次读书日活动功能主要是:五个问题对应五个动画交互页面,答完5道题之后展示一段视频(随机从书架上抽出一本书的动画效果),随后进入结果页面。

    在结果页需要做站内站外的分享交互,将结果页面利用html2canvas转成图片,再将图片分享到各个平台。

    开发过程中遇到的问题如下:

    ***html2canvas转apng资源元素异常***

    通过image标签使用的apng动画,当它播放完成之后,再使用html2canvas转image元素,此时得到的只是apng动图的第一帧静态图片而不是最后一帧,所以需要再播放完成之后将src替换成最后一帧图片的url再使用html2canvas转。

    ***html2canvas转image元素时失效***

    对于image元素,需要将其资源url import进来之后在dom中赋值到image元素的src上,写在css里不行。

    ***html2canvas会使当前页面中autoplay的audio再次播放***

    这是因为html2canvas会临时遍历创建一套当前页面中所有的dom元素,再将转换目标元素择出来。解决办法是:在调用html2canvas之前,将audio元素临时移除掉autoplay属性,执行完之后再加上autoplay属性。

    document.getElementById("WorldBookDayMusic").removeAttribute('autoPlay')
    

      

    ***在iOS移动端微信浏览器上,视频和音频无法播放,安卓端可以***

    解法如下:

    init = () => {
        if (this.refVideo) {
          this.refVideo.play()
          if (typeof WeixinJSBridge !== 'undefined') {
            WeixinJSBridge.invoke('getNetworkType', {}, e => {
              this.refVideo.play()
            })
          }
        }
      }

    ***在iOS手机上,H5页面中audio的音量无法通过volume来设置***

    解法如上:将音频文件本身的音量设置大些,这样在audio中直接通过src使用就可。

    *** 在安卓手机上,video视频会闪现下默认播放图标***

    解法如下图:加上 poster="noposter"即可

    ***在iOS 13.4版本上,html2canvas无效(无报错无响应)***

    解法:需要将html2canvas版本设置成 1.0.0-rc.4,即在package.json中 设置  "html2canvas": "1.0.0-rc.4"。但是这个版本在服务端渲染项目中会报 window is not defined错误,所以不能在页面顶部import,在使用的地方import。

    utils.js文件

    const importHtml2Canvas = () => import (/* webpackChunkName: "activityHtml2canvas" */ 'html2canvas')
    
    const _ = ''
    
    export {
      _ as default,
      importHtml2Canvas,
    }

    使用:

    const html2canvas = await (await (importHtml2Canvas)()).default

    ***在APP内,进入活动结果页面,点击分享调用客户端分享协议后,再点击重新测试,再次进入结果页时会再次触发客户端分享协议***

    解法:

    在didMount中调用getInitIframe方法,如下,将首次iframe的src存下来:

    getInitIframe = () => {
        const {isIOS} = this.props
        if (isIOS && document.getElementsByTagName('iframe')[0]) {
          this.setState({iframeSrc: document.getElementsByTagName('iframe')[0].src})
        }
      }

    点击重新测试按钮时,执行

    const {isIOS} = this.props
        if (isIOS && document.getElementsByTagName('iframe')[0]) {
          document.getElementsByTagName('iframe')[0].src = this.state.iframeSrc
        }
  • 相关阅读:
    动手动脑及作业
    技能——沟通
    大道至简第三章读后感
    编写一个程序,用户输入两个数,求其加减乘除,并用消息框显示计算结果。
    动手动脑及课后实验
    大道至简第六章
    继承与接口
    产生随机数并窗口显示他们的和
    大道至简——失败也是积累
    动手动脑
  • 原文地址:https://www.cnblogs.com/chenbeibei520/p/16167177.html
Copyright © 2020-2023  润新知