美文网首页
小程序播放iframe中的腾讯视频

小程序播放iframe中的腾讯视频

作者: strong9527 | 来源:发表于2018-11-30 16:02 被阅读413次

    公司最近推出了自己的小程序,但是在详情页面嵌入html标签的时候出现了技术难题,其中一条就是在详情页面播放腾讯视频。在网页端的视频处理,就是直接嵌入腾讯视频的官方iframe,但是在小程序端这就出现了困难。

    因为需要有播放视频的需求,所以小程序的官方组件 rich-text就不能用。所以只能使用wxparse,但是即便是wxparse本身也是不支持iframe标签的。

    所以我们只能修改wxparse本身的代码。

    修改wxparse的源码过程:

    1.支持iframe的转化

    首先在html2json.js文件中支持iframe的转化,因为小程序默认就不支持iframe所以在源码中并没有iframe的转化,需要我们自己添加

    可以看到之前源码对于img标签的处理,我们就照猫画虎对于iframe进行处理

    并取出有效的vid以便之后的程序视频插件使用。

    html2json.js文件修改:

    function html2json(html, bindName) {
       
        HTMLParser(html, {
            start: function (tag, attrs, unary) {
               ...
    
    
                //对img添加额外数据
                if (node.tag === 'img') {
                    node.imgIndex = results.images.length;
                    var imgUrl = node.attr.src;
                    if(!imgUrl) {
                      return
                    }
                    if (imgUrl[0] == '') {
                        imgUrl.splice(0, 1);
                    }
                    imgUrl = wxDiscode.urlToHttpUrl(imgUrl, __placeImgeUrlHttps);
                    node.attr.src = imgUrl;
                    node.from = bindName;
                    results.images.push(node);
                    results.imageUrls.push(imgUrl);
                }
    
    
               // 下面是需要我们添加的代码
                // 处理iframe的地址,取出vid并放入数据中,
                if(node.tag === 'iframe') {
                    // safeGetValue 只是一个取值的函数,可自行编写自己的取值函数。
                    node.vid = safeGetValue([1], node.attr.src.match(/https:\/\/v\.qq\.com.*vid=(\w*)/))
                }
    
            .....
    };
    
    // 此函数作用类似于ramda的path和pathOr,用于安全取值。
    
    function safeGetValue() {
      const argsLength = arguments.length
    
      if (argsLength !== 2 && argsLength !== 3) {
        throw '必须为两个或者三个参数'
      }
    
      var defaultValue
    
      if (argsLength === 3) {
        var [_defaultValue, keys, item] = arguments
        defaultValue = _defaultValue
      } else {
        var [keys, item] = arguments
      }
    
    
      if (!Array.isArray(keys)) {
        throw '参数有误,取值的keys必须为数组'
      }
    
      try {
        keys.forEach(key => {
          item = item[key]
        })
      } catch (e) {
        return defaultValue
      }
      
      return item
    }
    
    

    2.在wxParse.wxml添加腾讯视频插件的模板

    在html2json中保存的vid属性,在这时有了用处

    
    <template name="wxPraseIframe2TencentVideoPlugin">
      <view style="margin: 20rpx 0">
        <txv-video
          width="100%"
          height="600rpx"
          playerid="txv1"
          vid="{{item.vid}}"
          autoplay="{{false}}"
        >
        </txv-video>
      </view>
    </template>
    
    
    

    3.修改wxParse.wxml的循环模板,添加视频插件的模板

    中间的腾讯视频插件正是我们需要添加的。

    ps: 循环模板在源码中有10个,甚至更多,所以需要我们把每一个循环模板中都添加插件,也就是说在wxParse1-20中(我们公司需要最多展示20层嵌套的html标签,所以是20个)都要添加,这样才能保证你的视频能够正常播放。

    
    <template name="wxParse0">
    
     <!--video类型-->
        <block wx:elif="{{item.tag == 'video'}}">
          <template is="wxParseVideo" data="{{item}}" />
        </block>
    
       <!--腾讯视频插件-->
        <block wx:elif="{{item.tag == 'iframe'}}">
          <template is="wxPraseIframe2TencentVideoPlugin" data="{{item}}" />
        </block>
    
        <!--img类型-->
        <block wx:elif="{{item.tag == 'img'}}">
          <template is="wxParseImg" data="{{item}}" />
        </block>
    
    
    </template>
    
    
    
    

    当这些都配置完成后,就可以在详情页面播放腾讯视频了

    相关文章

      网友评论

          本文标题:小程序播放iframe中的腾讯视频

          本文链接:https://www.haomeiwen.com/subject/hiyhcqtx.html