详解小程序rich-text对富文本支持方案


Posted in Javascript onNovember 28, 2018

小程序富文本解析

目前小程序使用比较多的富文本方案一个是小程序自带的rich-text组件,一个是wxPrase。

wxPrase原理是把原有的html标签全部解析成小程序的组件,这样无论事件可控以及扩展性都是比较好的,但是对于行内渲染和多重渲染方面表现不是很好。

微信自带的rich-text组件刚好补足了wxPrase行内渲染和多重渲染方面表现方面的缺点,但是对于一些自定义的标签支持度不高并且会屏蔽元素所有事件,虽然支持直接解析html字符串,但是性能没有直接绑定json串好。

官网给的rich-text演示demo:

<rich-text nodes="{{nodes}}"></rich-text>
Page({
 data: {
  nodes: [{
   name: 'div',
   attrs: {
    class: 'div_class',
    style: 'line-height: 60px; color: red;'
   },
   children: [{
    type: 'text',
    text: 'Hello World!'
   }]
  }]
 },
 tap() {
  console.log('tap')
 }
})

rich-text-parser是一个能将html字符串转成rich-text组件可以解析的json格式,并且可以自定义扩展标签,并且支持修改rich-text组件内部html样式(包括img标签)。

使用方法:

npm i rich-text-parser -S --production
<rich-text nodes="{{html2}}"></rich-text>
import parser from 'rich-text-parser'

Page({
 data: {
    html: `<p>文殊林舍、山房由丽江铂尔曼度假酒店余明金老师设计,是<b>丽江古城的网红民宿</b>,2017年被评为<b>全国100家“最美民宿”</b>,以及2017年<b>最值得睡的“365张床”</b>。</p>
  <p><br></p>
  <p>两家店均位于古城北门坡半山处,背倚青山,<b>可俯瞰古城全景。</b></p>
  <p><br></p>
  <p>文殊·林舍2间房、文殊·山房6间房,共8间房。有可看丽江古城全景的景观房,有落满阳光的大床房,有花园院景的复式房...</p>
  <p><br></p>
  <p>房间<b>按照五星级标准配套</b>,科勒卫浴、鹅绒被、品牌乳胶床垫、高端洗漱用品等,提供免费洗衣机、烘干机、自助厨房等配套服务。</p>
  <p><br></p>
  <p>每个房间距离适中,为所有入住房客营造更私密舒适的空间体验感!另房东可以提供一对一的管家服务,接受所有房客吃喝玩乐咨询以及打折的各种便利活动!</p>
  <p><br></p>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1glier2lsdge1q9irbs1a5u4e.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红民宿大床房</h6></figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1glp4b1sml12641ma3b96pnv4j.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红民宿大床房</h6></figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1glu4p1q2s1hpm4qu127dhj4o.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红双床房</h6></figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1gmav71q0b182r1nd7184ufns4t.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红大床房(可观古城全景)</h6>
      </figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1gmg28udvhec1s4r1cvl1m2s52.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红大床房(可观古城全景)</h6>
      </figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1gmkvj1egf1254le7157quqj57.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红复式星空房(可观古城全景)</h6>
      </figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1gmuhq161sf621hu81l7slc85c.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红民宿别墅东院</h6></figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1gngk76441747omu1on619085h.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>餐厅</h6></figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1gnlm21gi916okcnf12mp1fh05m.jpg" rate="0.67">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>公共区域</h6></figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1go50bftu15c41rbgdoj1e4p5r.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>公共区域</h6></figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1gonmohor1duu1grv5gd8fu60.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明">公共区域-露台</figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1goslosu2qnn4tn1bdjus965.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红民宿汤池别墅西院</h6></figcaption>
    </figure>
  </div>
  <div class="kai-images">
    <figure contenteditable="false"><img src="http://images.kaishiba.com/o_1cs1gphvmfrgk2momcgko21g6a.jpg" rate="1.50">
      <figcaption contenteditable="true" class="" data-placeholder="请输入图片说明"><h6>丽江文殊设计师网红民宿别墅东院</h6></figcaption>
    </figure>
  </div>
  <p><br></p>
  <p><b>门店信息:</b></p>
  <p>·wifi已覆盖、24小时热水、吹风机、一次性用品</p>
  <p>·电热毯、壁炉、一对一管家服务等</p>
  <p><br></p>
  <p><b>商家联系电话:</b></p>
  <p>·地址:云南省丽江市古城区北门坡玄天巷26号</p>
  <p>·电话:15099128722</p>`,
  html2: []
 },
 onLoad () {
   const {html} = this.data
   // 定义需要解析的特殊标签,value不填默认是div
   parser.definedCustomTag({figure: 'div', figcaption: ''})
   const nodes = parser.getRichTextJson(html)
   console.log(nodes)
   this.setData({
    html2: nodes.children
   })
  }
})

源码参见rich-text-parser

效果图以及数据结构:

详解小程序rich-text对富文本支持方案

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 通用javascript函数库整理
Aug 14 Javascript
利用a标签自动解析URL分析网址实例
Oct 20 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
Aug 27 Javascript
jquery实现的Banner广告收缩效果代码
Sep 02 Javascript
AngularJS实用开发技巧(推荐)
Jul 13 Javascript
AngularJS学习第二篇 AngularJS依赖注入
Feb 13 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
Feb 23 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
Vue上传组件vue Simple Uploader的用法示例
Aug 25 Javascript
Vue头像处理方案小结
Jul 26 Javascript
Vue.js组件通信之自定义事件详解
Oct 19 Javascript
JS实现随机抽选获奖者
Nov 07 Javascript
微信小程序实现简单评论功能
Nov 28 #Javascript
微信小程序实现省市区三级地址选择
Jun 21 #Javascript
Vue一次性简洁明了引入所有公共组件的方法
Nov 28 #Javascript
react脚手架如何配置less和ant按需加载的方法步骤
Nov 28 #Javascript
微信小程序仿知乎实现评论留言功能
Nov 28 #Javascript
微信小程序实现评论功能
Nov 28 #Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
Nov 28 #Javascript
You might like
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
php实现算术验证码功能
2018/12/05 PHP
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
python迭代器与生成器详解
2016/03/10 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
pandas DataFrame运算的实现
2020/06/14 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
Python中的面向接口编程示例详解
2021/01/17 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
小学班主任培训方案
2014/06/04 职场文书
学生检讨书范文
2015/01/27 职场文书
幼儿教师个人总结
2015/02/05 职场文书
英语教师求职信范文
2015/03/20 职场文书
辞职申请书范本
2019/05/20 职场文书
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL