vue-quill-editor custom button base64 to imgUrl

The vue-quill-editor rich text editor is used in the project
Brief introduction:
  Quill based, rich text editor for Vue2 supports server-side rendering and single page applications.
Demo Page
Sum up:
  1. in general, simple and easy to use.
  2. you can customize the Option toolbar looks good to use

But the pictures used in the project were uploaded. Use this plugin directly. There was no problem. But the backstage couldn't stand it, and the pictures were encoded by base64. Background pictures are limited. Helpless, just want to solve the problem. Fortunately, the background provides an interface, the picture to URL, so good, first the picture to URL, in the rich text editor inside it is not OK?.

The reason is so simple, practice is really another matter.

容我装逼一把,哈哈,中文用户还是看下面吧。

项目中使用了 vue-quill-editor 富文本编辑器
简介:
  基于Quill、适用于Vue2的富文本编辑器,支持服务端渲染和单页应用。
Demo Page
总结:
  1.总的来说简洁好用。
  2.可以自定义Option toolbar貌似很好用的样子

但是项目中使用到了图片上传。直接使用这个插件。完全没问题。但是后台受不了了,传过去的图片是base64编码。后台图片做了限制。无奈只好想办法解决呗。好在后台提供了个接口,将图片转为URL,这样好啊,先把图片转为URL,在放到富文本编辑器里面不就行了吗。

道理是这么简单,实践确是另一回事。

问题一 怎么添加自定义的button。

demo中也提供了。

 <button type="button" @click="customButtonClick">img</button>

什么 img 太丑了,那就是用字符图标(Glyphicons 字体图标)

   <button type="button" @click="customButtonClick"><i class="glyphicon glyphicon glyphicon-picture"></i></button>

问题二 怎么打开file 选择图片。

这个一开始想着是自定义个 <input type="file" class="ql-image"/>
  图标太丑。
  class="ql-image" 放在上面button中 虽然好看,可以打开获取图片,但是还是base64不走自定义方法。放在input中没卵用。

该怎么实现那,其实也不难

 <input type="file" class="custom-input" @change='upload' style='display: none !important;'>

直接放个隐形的input就解决了。貌似很牛逼的样子

然后在 upload中写方法 调接口实现 Base64到url 的完美过度

最后才是重点:

------------------------------------------分割线-------------------------------------------------------
以下仅做参考

问题三 获取到了imgUrl后怎么插入到文档中。

最开始参考的是这位仁兄的回答
  但是放到customButton中是获取不到 this.$refs.myTextEditor.quillEditor更别说.getSelection();这个方法了。
  因为自定义的按钮是获取不到 quill 的。
  这个方法放到

 onEditorChange({editor, html, text}) {
//        console.log('editor change!', editor)
       console.log('editor change!', editor.getSelection())
    },
这样是好用的

那我该怎么办那 马丹 自己太机智了,有点投机取巧的做法

放大招了直接上代码
    <quill-editor ref="myTextEditor"
                              v-model="content"
                              :options="editorOption"
                              @focus="onEditorFocus($event)"
                              @ready="onEditorReady($event)"                 
                >
                  <div id="toolbar" slot="toolbar">
                    <button class="ql-bold">Bold</button>
                    <button class="ql-italic">Italic</button>
                    <select class="ql-size">
                      <option value="small"></option>
                      <option selected></option>
                      <option value="large"></option>
                      <option value="huge"></option>
                    </select>
                    <!-- Add subscript and superscript buttons -->
                    <!--<button type="button" class="ql-image"></button>-->
                    <button type="button" @click="customButtonClick">img</button>
                    <input type="file" class="custom-input" @change='upload' style='display: none !important;'>
                  </div>
                </quill-editor>
    data(){
      return {
        length: '',
        editor: {},
        editorOption: {
          modules: {
          //  imageImport: true,
          //  imageResize: {
          //    displaySize: true
         //   },
            toolbar: '#toolbar',
          }
        },
      }
  }
  methods: {
      onEditorFocus(editor) {
        this.editor = editor   //当content获取到焦点的时候就 存储editor
      },
      onEditorReady(editor) {
        this.editor = editor //当quill实例化完先 存储editor
      },

      customButtonClick(){
        var range
        if (this.editor.getSelection() != null) { 
          range = this.editor.getSelection()
          this.length = range.index  //content获取到焦点,计算光标所在位置,目的为了在该位置插入img
        } else {
          this.length = this.content.length  //content没有获取到焦点时候 目的是为了在content末尾插入img
        }
        this.$el.querySelector('.custom-input').click();   //打开file 选择图片
      },


   upload(event){
        var reader = new FileReader();
        var img1 = event.target.files[0];
        reader.readAsDataURL(img1);
        var that = this;
        reader.onloadend = function () {
          //上传图片
          that.pushImg(reader.result, 1)
        }
      },

   pushImg(base64, type){   
        let self = this
        var json = {data: [{id: 0, content: base64}]}         
        api.pushImgToGeturl(json).then(function (res) { //这一块可以忽略知识调接口获取到 imgurl
          if (res.data.success) {
              self.contentImg = res.data.data[0].url.url    //获取到了图片的URL
              console.log(self.contentImg)          
              self.editor.insertEmbed(self.length, 'image', self.contentImg); // ★这里才是重点★ 插入到content中
          }
        })
      }
}

完事。
有什么问题可以共同探讨。
或者有更好的方法,请告知,谢了。知识在于分享

最后翻阅了 那么多issues
最大的感触是,英语是硬伤啊,学好英语是编程的基础啊。

------------------------------------------分割线-------------------------------------------------------

这才是重点中的重点

这个问题GitHub上已经做了修改。
所以说以上代码就不用那么繁琐了。仅做参考就行。

    computed: {
      editor() {
        return this.$refs.myTextEditor.quill
      }
    },
//应该是quill,而非quillEditor

这样就可以在 customButtonClick中获取到

      customButtonClick(){
        console.log(this.editor)
      },

感谢@上善若水_3cd7的提醒。

            var range = self.editor.getSelection(true);
            var  length = range.index
            self.editor.insertEmbed(length, 'image', self.contentImg);

这样就不需要土办法了[捂脸]。直接在文中添加图片。而不需判断range.index

ok 感谢各位大神

路漫漫其修远兮吾将上下而求索的出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容

  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,234评论 7 249
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,555评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,973评论 4 60
  • 鲜为人知,超市女多男少,大部分体力活都要靠男人去做,在多乐意除了几个防损员,一时也难找更适当的人选。 逢时的更多女...
    勤得阅读 328评论 0 1
  • 我被扔在了不知道在哪儿的地方, 那一刻恐惧,勇敢一起拥挤出来 在20分钟以前 我被不知道该怎么称呼的黑车老板拉上车...
    微醺一世阅读 177评论 0 0