实现自己写的小程序富文本编辑以及展示,不跟PC端的兼容,但是可以在pc端显示以及修改,一旦修改,小程序不再做解析

Posted pinkyun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现自己写的小程序富文本编辑以及展示,不跟PC端的兼容,但是可以在pc端显示以及修改,一旦修改,小程序不再做解析相关的知识,希望对你有一定的参考价值。

富文本结构:

 1 <div class="detail_box">
 2                             <ul>
 3                                 <li v-for="(item4,index4) in detailAry" :key="index4">
 4                                     <!-- 文字 -->
 5                                     <div class="detail_list">
 6                                         <div class="list_t">
 7                                             <div class="list_l">
 8                                                 <span>item4.title</span>
 9                                             </div>
10                                             <div class="list_r">
11                                                 <div class="r_left">
12                                                     <img v-if="index4 == 0" src="https://img.xingxio.com/Group [email protected] (1).png" alt="">
13                                                     <img v-else @click="changeIndexL(index4)" src="https://img.xingxio.com/Group [email protected]" alt="">
14                                                     <img v-if="index4 == detailAry.length-1 && index4 != 0" src="https://img.xingxio.com/Group [email protected]" alt="">
15                                                     <img v-else @click="changeIndexR(index4)" src="https://img.xingxio.com/Group [email protected]" alt="">
16                                                 </div>
17                                                 <div class="r_right">
18                                                     <img @click="delDetailAry(index4)" v-show="index4 >0" class="del_img" src="https://img.xingxio.com/close_icon.png" alt="">
19                                                 </div>
20                                             </div>
21                                         </div>
22                                         <div class="inp_box" v-if="item4.type == 1">
23                                             <!-- <input type="text" v-model="item4.text" placeholder="请输入文字"> -->
24                                             <textarea v-show="isChange"  class="textarea" maxlength="1000" v-model="item4.text" placeholder="填写多行,可以换行,最多填写1000字"></textarea>
25                                         </div>
26                                         <!-- <div class="inp_box" v-if="item4.type == 2"> -->
27                                             <div class="img_box" v-if="item4.type == 2">
28                                                 <img class="img" :src="item4.src"  alt="" mode="aspectFit">
29                                             </div>
30                                             <div class="img_box" v-if="item4.type == 3">
31                                                 <video :controls="controls" :autoplay="false" :src="item4.src"></video>
32                                                 <div class="v_tips">苹果手机暂不支持播放视频</div>
33                                                 <!-- <img class="img" :src="item4.src"   mode="aspectFit"> -->
34                                             </div>
35                                         <!-- </div> -->
36                                     </div>
37                                     <!-- 图片 -->
38                                     <!-- <div class="detail_list img_list" v-if="item4.type == 2">
39                                         <div class="list_t">
40                                             <div class="list_l">
41                                                 <span>item4.title</span>
42                                             </div>
43                                             <div class="list_r">
44                                                 <img  src="https://img.xingxio.com/Group [email protected] (1).png" >
45                                                 <img src="https://img.xingxio.com/Group [email protected]" >
46                                                 <img src="https://img.xingxio.com/Group [email protected]" >
47                                                 <img src="https://img.xingxio.com/Group [email protected]" >
48                                                 <img class="del_img" src="https://img.xingxio.com/close_icon.png" >
49                                             </div>
50                                         </div>
51                                         <div class="inp_box">
52                                             <div class="img_box">
53                                                 <img class="img" :src="item4.src"   mode="aspectFill">
54                                             </div>
55                                         </div>
56                                     </div> -->
57                                     <!-- 视频 -->
58                                     <!-- <div class="detail_list img_list">
59                                         <div class="list_t">
60                                             <div class="list_l">
61                                                 <span>视频</span>
62                                             </div>
63                                             <div class="list_r">
64                                                 <img class="del_img" src="https://img.xingxio.com/close_icon.png" >
65                                             </div>
66                                         </div>
67                                         <div class="inp_box">
68                                             <div class="img_box">
69                                                 <video></video>
70                                             </div>
71                                         </div>
72                                     </div> -->
73                                 </li>
74                             </ul>
75                             <div class="detail_f">
76                                 <div class="f_list" @click="addDetailAry(1,‘文字‘)">
77                                     <img  src="https://img.xingxio.com/text_icon.png" alt="">
78                                     <span>文字</span>
79                                 </div>
80                                 <div class="f_list" @click="updateImg(6)">
81                                     <img class="p_img" src="https://img.xingxio.com/image_icon.png" alt="">
82                                     <span>图片</span>
83                                 </div>
84                                 <div class="f_list" v-if="false" >
85                                     <img class="yuyin_img" src="https://img.xingxio.com/yuyin_icon.png" alt="">
86                                     <span>语音</span>
87                                 </div>
88                                 <div class="f_list"  @click="uploadVideo">
89                                     <img  src="https://img.xingxio.com/video_icon.png" alt="">
90                                     <span>视频</span>
91                                 </div>
92                             </div>
93                         </div>

富文本样式:

  1 .detail_box 
  2                 width: 100%;
  3                 padding: 20rpx;
  4                 box-sizing: border-box;
  5                 ul 
  6                     width: 100%;
  7                     margin-bottom: 100rpx;
  8                     height: auto;
  9                     li
 10                         width: 100%;
 11                         height: auto;
 12                         .detail_list 
 13                             width: 100%;
 14                             .list_t 
 15                                 width: 100%;
 16                                 height: 80rpx;
 17                                 display: flex;
 18                                 align-items: center;
 19                                 justify-content: space-between;
 20                                 .list_l 
 21                                     color: #4A4A4A;
 22                                     font-size: 32rpx;
 23                                 
 24                                 .list_r 
 25                                     width: 200rpx;
 26                                     height: 100%;
 27                                     display: flex;
 28                                     align-items: center;
 29                                     justify-content: space-between;
 30                                     .r_left 
 31                                         width: 122rpx;
 32                                         display: flex;
 33                                         align-items: center;
 34                                         justify-content: space-between;
 35                                         img 
 36                                             width: 36rpx;
 37                                             height: 36rpx;
 38                                         
 39                                     
 40                                     .r_right 
 41                                         display: flex;
 42                                         align-items: center;
 43                                         img 
 44                                             width: 36rpx;
 45                                             height: 36rpx;
 46                                         
 47                                     
 48                                 
 49                             
 50                             .inp_box 
 51                                 margin-top: 20rpx;
 52                                 width: 100%;
 53                                 height: 300rpx;
 54                                 input 
 55                                     width: 100%;
 56                                     line-height: 80rpx;
 57                                     border: 0px;
 58                                     padding-left: 20rpx;
 59                                     box-sizing: border-box;
 60                                     font-size: 28rpx;
 61                                 
 62                                 .textarea 
 63                                     width: 100%;
 64                                     height: 280rpx;
 65                                     border: 0px;
 66                                     padding-left: 20rpx;
 67                                     box-sizing: border-box;
 68                                     font-size: 28rpx;
 69                                 
 70 
 71                             
 72                             .img_box 
 73                                 width: 100%;
 74                                 height: 300rpx;
 75                                 padding: 20rpx;
 76                                 box-sizing: border-box;
 77                                 img 
 78                                     width: 100%;
 79                                     height: 100%;
 80                                 
 81                                 video 
 82                                     width: 280rpx;
 83                                     height: 180rpx;
 84                                 
 85                                 .v_tips 
 86                                     margin-top: 20rpx;
 87                                     font-size: 28rpx;
 88                                     color: #9B9B9B;
 89                                     text-align: center;
 90                                     // line-height: 100%;
 91                                 
 92                             
 93                         
 94 
 95                     
 96                 
 97 
 98                 .detail_f 
 99                     width: 100%;
100                     height: 100rpx;
101                     border-radius: 6rpx;
102                     color: rgba(16, 16, 16, 1);
103                     font-size: 28rpx;
104 
105                     // box-shadow: 0px 0px 8rpx 2rpx rgba(0, 0, 0, 0.07);
106                     font-family: Arial;
107                     // border: 1px solid rgba(231, 236, 242, 1);
108                     display: flex;
109                     align-items: center;
110                     padding: 0px 30rpx;
111                     box-sizing: border-box;
112                     justify-content: space-between;
113                     .f_list 
114                         height: 100%;
115                         display: flex;
116                         align-items:center;
117                         justify-content: center;
118                         flex-direction: column;
119                         img 
120                             width: 32rpx;
121                             height: 32rpx;
122 
123                         
124                         .p_img 
125                             width: 34rpx;
126                         
127                         .yuyin_img 
128                             width: 34rpx;
129                             height: 34rpx;
130                         
131                         span 
132                             margin-top: 12rpx;
133                             color: #9B9B9B;
134                             font-size: 28rpx;
135                             // margin-left: 10rpx;
136                         
137                     
138 
139                 
140 
141             

效果图:技术图片技术图片

既然要兼容到pc端上的编辑器(本pc项目使用的是百度编辑器),所以存数据的时候带上标签传给后台

/**
             *  处理详情的图文
             */
            handleDetail()
                console.log(this.detailAry)
                let ary = []
                for (let i = 0; i < this.detailAry.length; i++) 
                    if(this.detailAry[i].type == 1)
                        let arr2 = []
                        arr2.push(this.detailAry[i].text)
                        // this.detailAry[i].text =arr2.join(`<br/>`)
                        this.detailAry[i].text = this.detailAry[i].text.replace(/\\n/g,"<br/>")
                        console.log(this.detailAry[i].text)
                        let text = `<div data-type="$1">$this.detailAry[i].text</div>`
                        ary.push(text)
                    else if(this.detailAry[i].type == 2)
                        let imgs = `<div data-type="$2"><img src="$this.detailAry[i].src" ></div>`
                        ary.push(imgs)
                    else if(this.detailAry[i].type == 3)
                        console.log(this.detailAry[i].src)
                        let video = `<div data-type="$3"><video controls=‘true‘ src="$this.detailAry[i].src"></video></div>`
                        ary.push(video)
                    
                
                console.log(ary)
                this.txt = ary.join(‘\\n‘)
                console.log(this.txt)
            ,

然而数据返回也是一个json的格式,所以解析方法,这是一个封装的方法,中间引用到一个插件的  

xmldom是一个解析标签的,因为小程序么有dom元素,也没有js中获取某某某的id啊  百度搜索xmldom就可以找到了 支持npm下载
/**
 * 解析富文本
 */
export const txtResolve = function(txt)
  if (txt) 
    console.log(txt)
    let doc = new DOMParser().parseFromString(txt)
    console.log(doc)
    let ary1 = doc.documentElement.getElementsByTagName(‘div‘)
    let detailAry = []
    console.log(ary1)
    if(ary1.length > 0)
      for (let i = 0; i < ary1.length; i++) 
        if(ary1[i].attributes[0].nodeValue == 1)
          let arr2 = ary1[i].childNodes
          let arr3 = []
          let str = ‘‘
          for (let j = 0; j < arr2.length; j++) 
            if(arr2[j].nodeValue)
              arr3.push(`$arr2[j].nodeValue`)
            else 
              arr3.push(`\\n`)
            
          
          str = arr3.join(‘‘)
          let obj = 
            type: 1,
            title: ‘文字‘,
            text: str
          
          detailAry.push(obj)
        
        if(ary1[i].attributes[0].nodeValue == 2)
          let obj = 
            type: 2,
            title: ‘图片‘,
            src: ary1[i].firstChild.getAttribute(‘src‘)
          
          detailAry.push(obj)
        
        if(ary1[i].attributes[0].nodeValue == 3)
          let obj = 
            type: 3,
            title: ‘视频‘,
            src: ary1[i].firstChild.getAttribute(‘src‘)
          
          detailAry.push(obj)
        
        if(ary1[i].attributes[0].nodeValue == 4)
            let srcs = []
            // console.log(ary1[i].childNodes)
            for (let k = 0; k < ary1[i].childNodes.length; k++) 
                // console.log(ary1[i].childNodes[k].getAttribute(‘src‘))
                srcs.push(ary1[i].childNodes[k].getAttribute(‘src‘))
            
            // console.log(srcs)
            let obj = 
                type: 4,
                title: ‘多图‘,
                srcs: srcs
            
            detailAry.push(obj)
        
      
    
    console.log(detailAry)
    return detailAry
   else 
    return []
  

 

注释: 每一个编辑的文本或者图片都是一个对象,数组循环,还有点击上下可以改变顺序,上下顺序的执行方法

/**
             * 控制详情排序
             */
            changeIndexL(index)  // 上升
                // console.log(index)
                // console.log(this.detailAry)
               if(index != 0)
                   this.swapArray(this.detailAry,index,index-1)
               else 
                   return false;
               

            ,
            changeIndexR(index) // 下降
                // console.log(index)
               if(index != this.detailAry.length)
                   this.swapArray(this.detailAry,index,index+1)
               else 
                   return false;
               
            ,
            swapArray(arr,index1,index2)
                arr[index1] = arr.splice(index2,1,arr[index1])[0];
                // console.log(arr)
                return arr
            ,

 

以上是关于实现自己写的小程序富文本编辑以及展示,不跟PC端的兼容,但是可以在pc端显示以及修改,一旦修改,小程序不再做解析的主要内容,如果未能解决你的问题,请参考以下文章

如何实现一个 Android 端的富文本编辑器

富文本编辑器内容在微信小程序中展示的解决方案

WinForm窗体怎么实现富文本控件就像ASP那样的富文本控件

若依前后端分离发布富文本框内容 | uni-app微信小程序展示富文本框内容

微信小程序富文本编辑的图片超出

Android实现EditText的富文本编辑