详解小程序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 相关文章推荐
javaScript 读取和设置文档元素的样式属性
Apr 14 Javascript
IE FF OPERA都可用的弹出层实现代码
Sep 29 Javascript
IE8 chrome中table隔行换色解决办法
Jul 09 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
Aug 15 Javascript
javascript实现倒计时并弹窗提示特效
Jun 05 Javascript
jquery超简单实现手风琴效果的方法
Jun 05 Javascript
JavaScript评论点赞功能的实现方法
Mar 13 Javascript
jQuery 实现图片的依次加载图片功能
Jul 06 jQuery
浅谈angular2 组件的生命周期钩子
Aug 12 Javascript
你应该知道的几类npm依赖包管理详解
Oct 06 Javascript
vue中使用极验验证码的方法(附demo)
Dec 04 Javascript
详解vue中v-for的key唯一性
May 15 Vue.js
微信小程序实现简单评论功能
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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
开发大型 PHP 项目的方法
2007/01/02 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
举例介绍Python中的25个隐藏特性
2015/03/30 Python
深入讲解Java编程中类的生命周期
2016/02/05 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Python class的继承方法代码实例
2020/02/14 Python
Python实现数字的格式化输出
2020/08/01 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
课程设计心得体会
2013/12/28 职场文书
入党思想汇报
2014/01/05 职场文书
社团招新策划书
2014/02/04 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
诚信考试承诺书
2014/03/27 职场文书
2014年教研活动总结范文
2014/04/26 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
工作经历证明范本
2015/06/15 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
python使用glob检索文件的操作
2021/05/20 Python