<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

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

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

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

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

        0x00 前言

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

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

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

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

        打開源碼一看,就 62 行,所以決定自己動(dòng)手來一個(gè)簡(jiǎn)單點(diǎn)的

        0x01 最簡(jiǎn)版

        最簡(jiǎn)版,其實(shí)就在 vue 組件中實(shí)例化一下 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>
        

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

        0x02 用法

        咋用呢?很簡(jiǎn)單,在其他組件中這樣:

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

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

        0x03 自定義 button

        下面是我項(xiàng)目中用到的自定義 button 的相關(guān)代碼,是一個(gè) 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'])
        }
        

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

        先實(shí)例化

        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)然上面實(shí)例化的步驟不一定要寫到這個(gè)組件里面,配置 options 也可以從組件外傳入

        0x04 細(xì)節(jié)和坑

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

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

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

        要解決這個(gè)也很簡(jiǎn)單,修改這一行:

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

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

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。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,因?yàn)橹坝?AngularJS 用過 medium-editor,并且需要自定義某些按鈕,而且最好還是選中彈出式的,所以就決定用 medium-edito
        推薦度:
        標(biāo)簽: 自定義 編輯器 自定
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久激情亚洲精品无码?V| 黄网址在线永久免费观看| 精品国产亚洲一区二区三区| 污污视频网站免费观看| 成人精品视频99在线观看免费| 在线看片免费人成视久网| 国产一级淫片a免费播放口之 | 成人无码WWW免费视频| 在线A亚洲老鸭窝天堂| 91精品成人免费国产| 亚洲成A人片777777| 国产好大好硬好爽免费不卡| 在线免费观看韩国a视频| 在线观看国产一区亚洲bd| 免费大片黄手机在线观看| 亚洲人成小说网站色| 日本高清免费观看| 亚洲国产精品无码久久青草| 91av免费在线视频| 免费观看四虎精品国产永久| 国产精品免费αv视频| 成人最新午夜免费视频| 德国女人一级毛片免费| 中文字幕亚洲综合精品一区| 免费观看美女用震蛋喷水的视频| 亚洲日韩中文字幕在线播放| 美国免费高清一级毛片| 亚洲熟妇无码另类久久久| 国产成人福利免费视频| 国产亚洲蜜芽精品久久| 亚洲精品国偷自产在线| 无人在线直播免费观看| 日本视频免费观看| 1区1区3区4区产品亚洲| 国产男女性潮高清免费网站| 亚洲av最新在线观看网址| 女人被男人躁的女爽免费视频| 亚洲综合男人的天堂色婷婷| 全部免费国产潢色一级| 日韩免费视频一区二区| 亚洲a∨国产av综合av下载|