博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
富文本上传七牛,如何把html转换为json
阅读量:5752 次
发布时间:2019-06-18

本文共 4533 字,大约阅读时间需要 15 分钟。

富文本

vue-quill-editor

需要下载vue-quill-editor模块,引入css和js  npm i vue-quill-editor  import "quill/dist/quill.core.css";  import "quill/dist/quill.snow.css";  import "quill/dist/quill.bubble.css";  import {quillEditor} from "vue-quill-editor";     
//绑定的富文本内容
//elmentui 的插件 /因为input file类型的特殊原因这里用elmentui 的插件来唤起上传图片 在beforeUpload钩子函数里传递file 复制代码

###上传回调

beforeUpload(e) {             this.fileChanges(e);        }复制代码

上传七牛代码

//qiniu 此对象需要  引入七牛 fileChanges(e) {      var _t = this;      let url = 'uploadxxx'        var ext = e.type.split("/")[1];        var formData = new FormData();        formData.append("ext", ext);        $.ajax({          type: "get",          async: false,          url: url,          data: {            ext: ext,          },          dataType: "json",          xhrFields: {            withCredentials: true          },          success: function(data) {            if (data.code === 0) {              var config = {                useCdnDomain: true,                region: qiniu.region.z1              };              var observable = qiniu.upload(                e,                data.info.keys[0],                data.info.token,                null,                config              );              _t.subscription = observable.subscribe({                next(res) {},                error(err) {                  // ...                },                complete(res) {                  // ...                  let quill = _t.editor;                  // 如果上传成功                  // 获取光标所在位置                  let length = quill.getSelection().index;                  // 插入图片  res.info为服务器返回的图片地址                  let str = quill.insertEmbed(                    length,                    "image",                    data.info.bucketUrl + data.info.keys                  );                  // 调整光标到最后                  quill.setSelection(length + 1);                }              });                        }          },          error: function(e) {          }        });        }    复制代码

数据格式整理

上传完了富文本结构可能是这样,图片地址显示base64 是预览,等到上传完成返回就会替换成服务器地址,因为最近接口有问题,所以显示的地址有问题,可以忽略。 这时候移动端没有富文本,移动端和pc都要显示这段内容,这时候就要统一格式了。要把上面的html解构转换为json格式,这里就要用到html2json了,他可以吧dom节点转换为父子级节点的json,使用起来很方便,如果自己去转换会有很多问题。至于转换的原理我想应该是递归查询节点,在生成树结构。没有认真去看码哈哈。

移动端需要的格式newsRichText: "[{"state":"textasdasd"},{"state":"imaghttps://post-static.maimaicc.com/post-static/2019-05-16/1570005744/WXLrk0c-0.jpeg"}]"复制代码

转码列子

npm install html2jsonvar html2json = require('html2json').html2json;var json2html = require('html2json').json2html;APIjson === html2json(document.body.innerHTML);html === json2html(json);console.assert(json === html);复制代码

html

sample text with inline tag

foo
goo
复制代码

json

{  node: 'root',  child: [    {      node: 'element',      tag: 'div',      attr: { id: '1', class: 'foo' },      child: [        {          node: 'element',          tag: 'h2',          child: [            { node: 'text', text: 'sample text with ' },            { node: 'element', tag: 'code', child: [{ node: 'text', text: 'inline tag' }] }          ]        },        {          node: 'element',          tag: 'pre',          attr: { id: 'demo', class: ['foo', 'bar'] },          child: [{ node: 'text', text: 'foo' }]        },        {          node: 'element',          tag: 'pre',          attr: { id: 'output', class: 'goo' },          child: [{ node: 'text', text: 'goo' }]        },        {          node: 'element',          tag: 'input',          attr: { id: 'execute', type: 'button', value: 'execute' }        }      ]    }  ]}复制代码

转换

//对插件生成的数据进行处理,处理成自己想要的格式  "[{"state":"textasdasd"},{"state":"imaghttps://xxxx.jpeg"}]" release(types, bol = true) {      let json = html2json(this.detailContent);      let arr = [];      for (let i of json.child) {        for (let j of i.child) {          if (j.node == "text") {            let obj = {};            let tex = "text" + j.text;            obj.state = tex;            arr.push(obj);          } else if (j.tag == "img") {            let obj = {};            let tex = "imag" + j.attr.src;            obj.state = tex;            arr.push(obj);          }        }      }复制代码
var html2json = require("html2json").html2json;复制代码

这样就完成了用elmentui在富文本中上传图片,并且将富文本转换为移动端可显示的内容,理论上后台应该保存两份格式的代码,一份是转换后的用于移动端读取,一份用来pc端显示,这样才能保证富文本的格式不变,样式不会出问题。所以需要两个字段,一个用于pc端读取,一个用于移动端读取。 感觉都是很棒的插件省了很多力气,尤其是这个富文本组件和转换格式插件,都很棒用起来,富文本是我用过最简单省力的富文本编辑器,强烈推荐。

转载于:https://juejin.im/post/5d01b735f265da1bc23f720d

你可能感兴趣的文章
最懒的程序员
查看>>
JAVA8 Stream 浅析
查看>>
inner join on, left join on, right join on要详细点的介绍
查看>>
SAS vs SSD对比测试MySQL tpch性能
查看>>
Spring boot 整合CXF webservice 全部被拦截的问题
查看>>
Pinpoint跨节点统计失败
查看>>
【Canal源码分析】Canal Server的启动和停止过程
查看>>
机房带宽暴涨问题分析及解决方法
查看>>
iOS 绕过相册权限漏洞
查看>>
我的友情链接
查看>>
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
[转载] 中华典故故事(孙刚)——19 万岁
查看>>
修改hosts文件里面的主机名,oralce asm无法启动
查看>>
Maven学习总结(十)——使用Maven编译项目gbk的不可映射问题
查看>>
php5编译安装常见错误和解决办法集锦
查看>>
Linux远程访问及控制
查看>>
MongoDB实战系列之五:mongodb的分片配置
查看>>
Unable to determine local host from URL REPOSITORY_URL=http://
查看>>
Java Tomcat SSL 服务端/客户端双向认证(二)
查看>>