• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕)

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:31:49
    文檔

    VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕)

    VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕):0x00 前言 VueJS 社區(qū)里面關(guān)于富文本編輯器的集成也不少了,但是之前小調(diào)研了一下,基本上就是 quill,medium-editor,因為之前用 AngularJS 用過 medium-editor,并且需要自定義某些按鈕,而且最好還是選中彈出式的,所以就決定用 medium-edito
    推薦度:
    導(dǎo)讀VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕):0x00 前言 VueJS 社區(qū)里面關(guān)于富文本編輯器的集成也不少了,但是之前小調(diào)研了一下,基本上就是 quill,medium-editor,因為之前用 AngularJS 用過 medium-editor,并且需要自定義某些按鈕,而且最好還是選中彈出式的,所以就決定用 medium-edito

    0x00 前言

    VueJS 社區(qū)里面關(guān)于富文本編輯器的集成也不少了,但是之前小調(diào)研了一下,基本上就是 quill,medium-editor,因為之前用 AngularJS 用過 medium-editor,并且需要自定義某些按鈕,而且最好還是選中彈出式的,所以就決定用 medium-editor。

    社區(qū)里面 star 較多的就是這個了:vue-medium-editor,但是打開它官網(wǎng),看了看文檔,越看越別扭,來看看它用法:

    <!-- index.html -->
    <medium-editor :text='myText' :options='options' custom-tag='h2' v-on:edit='applyTextEdit'>

    gosh,傳這么多參數(shù),我只想要一個簡單的 editor 啊

    打開源碼一看,就 62 行,所以決定自己動手來一個簡單點的

    0x01 最簡版

    最簡版,其實就在 vue 組件中實例化一下 medium-editor 就可以了

    <template>
     <div class="textEditor" @input="handleInput">
     </div>
    </template>
    <script>
    /* eslint-disable no-new */
    import MediumEditor from 'medium-editor'
    export default {
     props: {
     value: String,
     options: {
     type: Object,
     default: () => ({})
     }
     },
     data () {
     return {
     editor: null // 用來存放 editor 
     }
     },
     watch: {
     // refer: https://github.com/FranzSkuffka/vue-medium-editor/blob/master/index.js
     value (newVal, oldVal) {
     if (newVal !== this.$el.innerHTML) { // 用 $el.innerHTML 來解決 v-html 的光標(biāo)跳到行首的問題
     this.$el.innerHTML = newVal || ''
     }
     }
     },
     methods: {
     handleInput (e) {
     this.$emit('input', e.target.innerHTML)
     }
     },
     mounted () {
     // 處理初始值的情況
     this.$el.innerHTML = this.value
     // 這里當(dāng)然可以自定義 options 啦
     this.editor = new MediumEditor(this.$el, Object.assign({}, this.options))
     // medium-editor 的 api,監(jiān)聽內(nèi)容改變化
     this.editor.subscribe('editableInput', this.handleInput)
     },
     beforeDestroy () {
     this.editor.unsubscribe('editableInput', this.handleInput)
     this.editor.destroy()
     }
    }
    </script>
    

    完成~,是不是很簡單~~哈哈,最簡版是一個 v-html 控制的,但是會有自動跳轉(zhuǎn)到首行的問題,所以這里是最終版,細節(jié)問題看注釋啦

    0x02 用法

    咋用呢?很簡單,在其他組件中這樣:

    <text-editor v-model="vm.richText"></text-editor>

    當(dāng)然 你首先得安裝 medium-editor的 js 和 css了

    0x03 自定義 button

    下面是我項目中用到的自定義 button 的相關(guān)代碼,是一個 buttonBuilder:

    import MediumEditor from 'medium-editor'
    import rangy from 'rangy/lib/rangy-core.js'
    import 'rangy/lib/rangy-classapplier'
    import 'rangy/lib/rangy-highlighter'
    import 'rangy/lib/rangy-selectionsaverestore'
    import 'rangy/lib/rangy-textrange'
    import 'rangy/lib/rangy-serializer'
    const pHash = {
     p1: { name: 'p1', class: 'fs-36' },
     p2: { name: 'p2', class: 'fs-30' },
     p3: { name: 'p3', class: 'fs-24' },
     p4: { name: 'p4', class: 'fs-18' },
     p5: { name: 'p5', class: 'fs-14' },
     p6: { name: 'p6', class: 'fs-12' }
    }
    function pButtonCreator (p) {
     return MediumEditor.Extension.extend({
     name: p.name,
     init: function () {
     this.classApplier = rangy.createClassApplier(p.class, {
     elementTagName: 'span',
     normalize: false
     })
     this.button = this.document.createElement('button')
     this.button.classList.add('medium-editor-action')
     this.button.innerHTML = p.name
     this.button.title = p.class
     this.on(this.button, 'click', this.handleClick.bind(this))
     },
     getButton: function () {
     return this.button
     },
     clearFontSize: function () {
     MediumEditor.selection.getSelectedElements(this.document).forEach(function (el) {
     if (el.nodeName.toLowerCase() === 'span' && el.hasAttribute('class')) {
     el.removeAttribute('class')
     }
     })
     },
     handleClick: function (event) {
     this.clearFontSize()
     this.classApplier.toggleSelection()
     // Ensure the editor knows about an html change so watchers are notified
     // ie: <textarea> elements depend on the editableInput event to stay synchronized
     this.base.checkContentChanged()
     }
     })
    }
    export default {
     P1: pButtonCreator(pHash['p1']),
     P2: pButtonCreator(pHash['p2']),
     P3: pButtonCreator(pHash['p3']),
     P4: pButtonCreator(pHash['p4']),
     P5: pButtonCreator(pHash['p5']),
     P6: pButtonCreator(pHash['p6'])
    }
    

    簡單來說就是給選中的文字加一些 class (上面是 fs-xx 之類的),其中需要引一個鼠標(biāo)選中的庫 rangy,挺煩人的也是,然后在 text-editor 中這樣用:

    先實例化

    import ButtonBuilder from './buttonBuilder'
    var editorOptions = {
     toolbar: {
     buttons: ['bold', 'italic', 'underline', 'removeFormat', 'p3', 'p4', 'p5', 'p6']
     },
     buttonLabels: 'fontawesome', // use font-awesome icons for other buttons
     extensions: {
     p3: new ButtonBuilder.P3(),
     p4: new ButtonBuilder.P4(),
     p5: new ButtonBuilder.P5(),
     p6: new ButtonBuilder.P6()
     },
     placeholder: false
    }
    

    再放到 editor 上

    代碼如下:
    this.editor = new MediumEditor(this.$el, Object.assign({}, editorOptions, this.options))

    當(dāng)然上面實例化的步驟不一定要寫到這個組件里面,配置 options 也可以從組件外傳入

    0x04 細節(jié)和坑

    1、這里用到了 v-model 的自定義實現(xiàn),詳見官方文檔:v-model

    簡單來說呢就是 props: value ,和 this.$emit('input', model) 就可以實現(xiàn)在組件中模擬 v-model 啦

    2、多個 editor 使用的自定義button 實例的問題。由于我自己應(yīng)用的時候有兩個挨著的 <text-editor>,用的上面的代碼會導(dǎo)致兩個 editor 實例用的是同一個 button 實例,這會導(dǎo)致一個很嚴重的問題:即編輯下面編輯器的內(nèi)容,可能會修改的上面的編輯器?。?br />

    要解決這個也很簡單,修改這一行:

    代碼如下:
    this.editor = new MediumEditor(this.$el, Object.assign({}, _.cloneDeep(editorOptions), this.options))

    將自定義的 options 深復(fù)制一下,這里借助了 lodash 的函數(shù)。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕)

    VueJS 集成 Medium Editor的示例代碼 (自定義編輯器按鈕):0x00 前言 VueJS 社區(qū)里面關(guān)于富文本編輯器的集成也不少了,但是之前小調(diào)研了一下,基本上就是 quill,medium-editor,因為之前用 AngularJS 用過 medium-editor,并且需要自定義某些按鈕,而且最好還是選中彈出式的,所以就決定用 medium-edito
    推薦度:
    標(biāo)簽: 自定義 編輯器 自定
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 色欲久久久天天天综合网精品| 亚洲一区无码精品色| 国产啪亚洲国产精品无码| 国产综合精品一区二区三区| 久久精品亚洲欧美日韩久久| 久久精品国产精品青草| 亚洲综合国产精品第一页| 国产三级精品三级在专区| 好属妞这里只有精品久久| 精品亚洲成AV人在线观看| 亚洲国产av无码精品| 国内精品久久久久久久久电影网| 四虎精品影院永久在线播放| 99久久精品影院老鸭窝| 久久综合国产乱子伦精品免费| 欧美日韩精品一区二区三区不卡| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 国产乱人伦偷精品视频AAA| 亚洲国产精品国自产拍AV| 无码精品第一页| 男女男精品网站免费观看| 国产精品成人免费观看| 91精品国产综合久久香蕉 | 精品国产亚洲男女在线线电影 | 国产99久久久国产精品~~牛| 国产精品嫩草影院一二三区入口 | 国产精品黄页免费高清在线观看| 久久青青草原国产精品免费| 九九热这里只有在线精品视| 51视频国产精品一区二区| 91麻豆精品视频| 国产一精品一av一免费爽爽| 国产精品视频分类一区| 国产精品欧美亚洲韩国日本| 99久久精品国产高清一区二区| 国产精品久久久久影视不卡| 久久精品国产一区| 欧美亚洲国产成人精品| jizz国产精品| 九九久久精品无码专区| 四虎国产精品永免费|