134 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/*
 | 
						||
  trees 递归子组件
 | 
						||
  github:https://github.com/jin-yufeng/Parser
 | 
						||
  docs:https://jin-yufeng.github.io/Parser
 | 
						||
  author:JinYufeng
 | 
						||
  update:2020/04/25
 | 
						||
*/
 | 
						||
Component({
 | 
						||
  data: {
 | 
						||
    canIUse: !!wx.chooseMessageFile,
 | 
						||
    placeholder: "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='225'/>",
 | 
						||
    inlineTags: require('../libs/config.js').inlineTags
 | 
						||
  },
 | 
						||
  properties: {
 | 
						||
    nodes: Array,
 | 
						||
    lazyLoad: Boolean
 | 
						||
  },
 | 
						||
  methods: {
 | 
						||
    // 自定义事件
 | 
						||
    copyCode(e) {
 | 
						||
      wx.showActionSheet({
 | 
						||
        itemList: ['复制代码'],
 | 
						||
        success: () =>
 | 
						||
          wx.setClipboardData({
 | 
						||
            data: e.target.dataset.content
 | 
						||
          })
 | 
						||
      })
 | 
						||
    },
 | 
						||
    // 视频播放事件
 | 
						||
    play(e) {
 | 
						||
      this.top.group && this.top.group.pause(this.top.i);
 | 
						||
      if (this.top.videoContexts.length > 1 && this.top.data.autopause)
 | 
						||
        for (var i = this.top.videoContexts.length; i--;)
 | 
						||
          if (this.top.videoContexts[i].id != e.currentTarget.id)
 | 
						||
            this.top.videoContexts[i].pause();
 | 
						||
    },
 | 
						||
    // 图片事件
 | 
						||
    imgtap(e) {
 | 
						||
      var attrs = e.currentTarget.dataset.attrs;
 | 
						||
      if (!attrs.ignore) {
 | 
						||
        var preview = true;
 | 
						||
        this.top.triggerEvent('imgtap', {
 | 
						||
          id: e.currentTarget.id,
 | 
						||
          src: attrs.src,
 | 
						||
          ignore: () => preview = false
 | 
						||
        })
 | 
						||
        if (preview) {
 | 
						||
          if (this.top.group) return this.top.group.preview(this.top.i, attrs.i);
 | 
						||
          var urls = this.top.imgList,
 | 
						||
            current = urls[attrs.i] ? urls[attrs.i] : (urls = [attrs.src], attrs.src);
 | 
						||
          wx.previewImage({
 | 
						||
            current,
 | 
						||
            urls
 | 
						||
          })
 | 
						||
        }
 | 
						||
      }
 | 
						||
    },
 | 
						||
    loadImg(e) {
 | 
						||
      var i = e.target.dataset.i;
 | 
						||
      if (this.data.lazyLoad && !this.data.nodes[i].load)
 | 
						||
        this.setData({
 | 
						||
          [`nodes[${i}].load`]: true
 | 
						||
        })
 | 
						||
    },
 | 
						||
    // 链接点击事件
 | 
						||
    linkpress(e) {
 | 
						||
      var jump = true,
 | 
						||
        attrs = e.currentTarget.dataset.attrs;
 | 
						||
      attrs.ignore = () => jump = false;
 | 
						||
      this.top.triggerEvent('linkpress', attrs);
 | 
						||
      if (jump) {
 | 
						||
        if (attrs['app-id'])
 | 
						||
          wx.navigateToMiniProgram({
 | 
						||
            appId: attrs['app-id'],
 | 
						||
            path: attrs.path
 | 
						||
          })
 | 
						||
        else if (attrs.href) {
 | 
						||
          if (attrs.href[0] == '#')
 | 
						||
            this.top.navigateTo({
 | 
						||
              id: attrs.href.substring(1)
 | 
						||
            })
 | 
						||
          else if (attrs.href.indexOf('http') == 0 || attrs.href.indexOf('//') == 0)
 | 
						||
            wx.setClipboardData({
 | 
						||
              data: attrs.href,
 | 
						||
              success: () =>
 | 
						||
                wx.showToast({
 | 
						||
                  title: '链接已复制'
 | 
						||
                })
 | 
						||
            })
 | 
						||
          else
 | 
						||
            wx.navigateTo({
 | 
						||
              url: attrs.href,
 | 
						||
            })
 | 
						||
        }
 | 
						||
      }
 | 
						||
    },
 | 
						||
    // 错误事件
 | 
						||
    error(e) {
 | 
						||
      var context, source = e.target.dataset.source,
 | 
						||
        i = e.target.dataset.i,
 | 
						||
        node = this.data.nodes[i];
 | 
						||
      if (source == 'video' || source == 'audio') {
 | 
						||
        // 加载其他 source
 | 
						||
        var index = (node.i || 0) + 1;
 | 
						||
        if (index < node.attrs.source.length)
 | 
						||
          return this.setData({
 | 
						||
            [`nodes[${i}].i`]: index
 | 
						||
          })
 | 
						||
        if (this.top) context = this.top.getVideoContext(e.target.id);
 | 
						||
      } else if (source == 'img')
 | 
						||
        context = {
 | 
						||
          setSrc: src => {
 | 
						||
            this.setData({
 | 
						||
              [`nodes[${i}].attrs.src`]: src
 | 
						||
            })
 | 
						||
          }
 | 
						||
        }
 | 
						||
      this.top && this.top.triggerEvent('error', {
 | 
						||
        source,
 | 
						||
        target: e.target,
 | 
						||
        context,
 | 
						||
        ...e.detail
 | 
						||
      })
 | 
						||
    },
 | 
						||
    // 加载视频
 | 
						||
    loadVideo(e) {
 | 
						||
      var i = e.target.dataset.i;
 | 
						||
      this.setData({
 | 
						||
        [`nodes[${i}].lazyLoad`]: false,
 | 
						||
        [`nodes[${i}].attrs.autoplay`]: true
 | 
						||
      })
 | 
						||
    }
 | 
						||
  }
 | 
						||
}) |