实现自己写的小程序富文本编辑以及展示,不跟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
            },

原文地址:https://www.cnblogs.com/PinkYun/p/11152924.html

时间: 2024-10-09 21:13:48

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

微信小程序使用wxParse实现接入富文本编辑

简介 微信小程序中比如活动说明,简介这样的图文介绍说明页面,后台通常配置成富文本编辑框,由后台直接输入内容,然后在小程序界面展现. 但是富文本编辑提取到内容是html格式的,写法与小程序的wxml并不一致,那么怎么样才能做到富文本能够在小程序页面中显示呢? 解决办法 有位大牛开发了一个模板叫作wxParse,可以直接引入小程序使用.下面把大牛的github地址贴上来: https://github.com/icindy/wxParse 想要了解更多的同学可以直接去他的github下查看说明文档.

微信小程序富文本-wxParse的使用

最近小程序蛮火的,公司要做于是学了一点点小程序 不知道你们有没有遇到过这种问题: 从公司服务器获取的文章内容是有HTML标签格式的一段内容,但是微信是不支持这些标签的,怎么办呢? 1.一般网站后台的文章是这样的,带有很多的html标签(这里是截取的今日头条某文章内容),但是小程序并不支持,它会以文本直接显示 怎么办呢? 2.在这个时候可以考虑 wxParse wxParse信息 版本号0.1 历史版本号0.2 具体代码请查看仓库分支V1 github地址: https://github.com/

微信小程序富文本编译wxParse

资料相关: https://github.com/icindy/wxParse 场景:微信小程序文章详情想要展示一些带有html标签的文章,但是不支持,直接展示一堆html标签,用wxParse可以解析出html标签展示为真正的文本格式. 按照git文档的步骤即可: 1.拷贝文件wxParse:- wxParse/ -wxParse.js(必须存在) -html2json.js(必须存在) -htmlparser.js(必须存在) -showdown.js(必须存在) -wxDiscode.js

小程序富文本解析

微信小程序富文本解析wxParse:https://github.com/icindy/wxParse 百度小程序富文本解析bdParse:https://github.com/fengye002012/bdParse 抖音头条小程序富文本解析ttParse:https://github.com/nqp1994/ttParse 原文地址:https://www.cnblogs.com/suni1024/p/11634609.html

asp.net mvc4 razor视图 (之) 添加 所见即所得 富文本编辑框

原文地址:http://www.dotnetfunda.com/articles/show/2657/implementing-richtexteditor-or-wysiwyg-tinymce-in-aspnet-mvc 总结下: 通过"管理Nuget程序包"功能添加tinymce到专案. 然后对于需要变成wysiwyg的输入框添加属性,AllowHtml和UIHint即可,如下: [AllowHtml] [UIHint("tinymce_full_compressed&q

laravel富文本编辑和图片上传

---恢复内容开始--- 首先先找到一个适合的编辑器是胜利的一步,选择wangEditor这个编辑器 地址:http://www.wangeditor.com/ 然后选择下载,我是通过网上学习的,所以直接选择的是2.1.23下载 下载后,将dist中的js/css/fonts,放到public文件夹下 当然后面我们需要查看文档中的信息 地址:https://www.kancloud.cn/wangfupeng/wangeditor2/113965 下一步: 我们需要把js/css引入html页面

.NET中应用Ueditor(富文本编辑)的配置和使用

一.Ueditor的下载 1.百度编辑器下载地址:http://ueditor.baidu.com/website/download.html 2.下载完整源码包,解压到任意目录,解压后的源码目录结构如下所示: 3.编辑器展示: 二.Ueditor的使用 1.添加到项目中如图所示: 2.新建项目中进行引用 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestUeditor.a

JavaScript示例八(富文本编辑框)

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>富文本编辑,采用iframe嵌入的方法</title> </head> <body> <iframe name="richedit" style="height:200px;width:300px;

功能强大的 iOS 富文本编辑与显示框架:YYText

功能强大的 iOS 富文本编辑与显示框架.(该项目是 YYKit 组件之一) 特性 API 兼容 UILabel 和 UITextView 支持高性能的异步排版和渲染 扩展了 CoreText 的属性以支持更多文字效果 支持 UIImage.UIView.CALayer 作为图文混排元素 支持添加自定义样式的.可点击的文本高亮范围 支持自定义文本解析 (内置简单的 Markdown/表情解析) 支持文本容器路径.内部留空路径的控制 支持文字竖排版,可用于编辑和显示中日韩文本 支持图片和富文本的复