成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Quill編輯器插入自定義HTML記錄的示例詳解

Quill編輯器插入自定義HTML記錄的示例詳解

熱門標(biāo)簽:電話機器人批發(fā) 強訊外呼系統(tǒng) 長春極信防封電銷卡公司 crm外呼系統(tǒng)好不好 智能電銷機器人廣告語 電銷外呼線路改不外呼線路 重慶人工智能電銷機器人報價 愛巢地圖標(biāo)注 貴陽ai外呼系統(tǒng)

轉(zhuǎn)眼已經(jīng)2020年,饑渴的人類不再滿足于簡單的文本,于是有了花里胡哨的攜帶各種樣式的文本,然而有文本還不夠,我們還需要讓用戶在編輯的時候,能夠插入各種自定義消息類型,讓我們發(fā)出去的軟文更加好看,因此有了這篇文章。

前言

由于Quill編輯器自帶的富文本過濾(大部分主流編輯器都會對富文本進(jìn)行過濾處理),導(dǎo)致開發(fā)者想要配置自定義HTML模板時,遇到了不少麻煩。

一、Quill渲染邏輯分析

為了自定義Quill中的HTML塊內(nèi)容,首先需要了解Quill內(nèi)部的渲染流程,這里有幾個關(guān)鍵的概念需要了解:

1、Delta

Delta是Quill內(nèi)部定義的一個數(shù)據(jù)格式,用于表示文檔內(nèi)容以及文檔修改操作,易讀且格式簡單,通過Delta的形式來維護(hù)文檔內(nèi)容,HTML內(nèi)容和Delta兩者可以相互轉(zhuǎn)化。

舉個例子:

這樣一段富文本會被表示成以下的格式:

{  
"ops":[ 
{"insert":"this is a simple text.\\nbut when "}, 
{"attributes":{"bold":true},"insert":"it is "}, 
{"insert":"not bold.\\nlet me try "}, 
{"attributes":{"italic":true},"insert":"italic "}, 
{"insert":"haha\\nwhat about "}, {"attributes": 
{"italic":true,"bold":true},"insert":"both"}, 
{"insert":" ?\\n"} ]  
}"

普通的文本會被定義成一個個的insert動作,每一項代表這一個delta,都是對文本內(nèi)容的描述。

類似的,如果修改和刪除也會生成對應(yīng)的delta,之后會將新生成的change delta,與原有的delta進(jìn)行合并操作,生成新的delta。(delta中一共包含三種操作:insert、delete、retain)

保留前10個字符,對后續(xù)的20個字符進(jìn)行加粗操作的delta如下:

{
  "ops": [
    { "retain":  },
    { "retain": , "attributes": { "bold":  } }
  ]
}

保留前10個字符,對后續(xù)的20個字符進(jìn)行刪除操作如下:

{
  "ops": [
    { "retain":  },
    { "delete":  }
  ]
}

2、Parchment

Parchment是抽象的文檔模型,對Blot進(jìn)行管理。

將Parchment理解成完整的DOM樹結(jié)構(gòu)的話,那么Blot就是其中一個個單一的節(jié)點。而Blot去了Quill中默認(rèn)的以外,還允許我們進(jìn)行自定義,給了更大的擴(kuò)展空間。

3、Blot

Blot是Parchment文檔的組成部分,相當(dāng)于對DOM節(jié)點類型的抽象,而一個具體的Blot實例里仍有其他的節(jié)點信息。

全局的根節(jié)點Blot是由Quill內(nèi)部自定義的Scroll類型Blot,管理其下面的所有Blot。

對于Blot的實現(xiàn)定義可以參照這里: https://github.com/quilljs/parchment#blots

Quill中默認(rèn)定義的Blot如下:

這其中常見的包括TextBlot(行內(nèi)普通文本)、Inline(行內(nèi)攜帶樣式的普通文本)、Block(塊級行,一般以段落p為單位)、Break(換行)、Image(圖片IMG插入)、Bold(加粗文本)。

而一段HTML如何構(gòu)建出Blot?Quill中會根據(jù)節(jié)點類型優(yōu)先排除文本節(jié)點,如果是元素節(jié)點會根據(jù)節(jié)點的ClassName進(jìn)行再次判斷,如果仍然無法找到匹配的BlotName,則默認(rèn)匹配以下的映射關(guān)系,來找到對應(yīng)的BlotClass。

4、Delta的實際意義

既然已經(jīng)有Blot可以來表示我們的內(nèi)容結(jié)構(gòu)了,為什么還需要Delta?Delta本身只是一份內(nèi)容數(shù)據(jù)的維護(hù),也就是說HTML的更新,無論是用戶輸入,還是API操作,都會同步更新到Delta中,而Delta如果不作為HTML的數(shù)據(jù)源的話,那么維護(hù)一份Delta數(shù)據(jù)的意義又在哪里?

如果HTML => Delta,而不存在Delta=>HTML,那么不停地去維護(hù)一份delta的意義是什么?

1、由Delta生成HTML其實是存在的,只不過應(yīng)用場景只限于初始化文檔的時候,Quill會對傳入的初始化HTML字符串進(jìn)行解析處理,生成對應(yīng)的Delta,其次通過applyDelta的方式,生成DOM節(jié)點回顯與頁面中。

2、看到這里你可能還不滿意,為啥非要走這一步流程,初始化的時候直接一段字符串document.getElementById('container').innerHTML = val不行嗎,是的,可以,但是Delta的存在讓用戶的文檔變得粒度更細(xì)小,變得易維護(hù),變得可追溯。假如A和B同時編輯著一份文檔,A刪除了第二行的10個字符,不需要將文檔內(nèi)容全量更新,只需要提交action操作,同步自己的行為,而B這邊也只需要進(jìn)行沖突處理后merge即可。雖然Delta的維護(hù)讓邏輯變得復(fù)雜了不少,但它的存在也讓文檔有了更多擴(kuò)展的可能。

5、編輯器渲染與更新流程

對于內(nèi)容的修改一共有以下3種方式:

1、初始化編輯器內(nèi)容:初始化調(diào)用quill.pasteHTML,經(jīng)過HTML過濾和解析回顯到編輯框中。

2、Input Event:用戶輸入和編輯操作,通過MutationObserver監(jiān)聽處理,更新delta。

3、API調(diào)用:調(diào)用內(nèi)部提供API,通過modify方法,而后調(diào)用全局Scroll實例的方法去修改。

二、插入自定義HTML塊

由于文章內(nèi)容越來越多樣化,在文章插入地圖、音樂播放器、廣告面板等需求的存在,讓我們需要對富文本編輯器擴(kuò)展出更多的功能。但是同時也要做好xss防護(hù)攻擊。

按照第一部分的講述,我們需要插入一個自定義HTML塊,同時又要Quill能夠識別,聰明的你一定想到了,我們需要自定義一個Blot。通過定義好Blot的方式,讓Quill在初始化的時候能夠識別我們的HTML塊展示,同時也讓我們在插入HTML塊的時候不會被Quill進(jìn)行臟HTML過濾。

注冊Blot方法如下:

export default function (Quill) {
  // 引入源碼中的BlockEmbed
  const BlockEmbed = Quill.import('blots/block/embed');
  // 定義新的blot類型
  class AppPanelEmbed extends BlockEmbed {
    static create(value) {
      const node = super.create(value);
      node.setAttribute('contenteditable', 'false');
      node.setAttribute('width', '100%');
      //   設(shè)置自定義html
      node.innerHTML = this.transformValue(value)
      return node;
    }

    static transformValue(value) {
      let handleArr = value.split('\n')
      handleArr = handleArr.map(e => e.replace(/^[\s]+/, '')
        .replace(/[\s]+$/, ''))
      return handleArr.join('')
    }

    // 返回節(jié)點自身的value值 用于撤銷操作
    static value(node) {
      return node.innerHTML
    }
  }
  // blotName
  AppPanelEmbed.blotName = 'AppPanelEmbed';
  // class名將用于匹配blot名稱
  AppPanelEmbed.className = 'embed-innerApp';
  // 標(biāo)簽類型自定義
  AppPanelEmbed.tagName = 'div';
  Quill.register(AppPanelEmbed, true);
}

接下來你只需要這樣調(diào)用,便可以在編輯器中插入自定義的HTML塊:

quill.insertEmbed(quill.getSelection().index || 0, 'AppPanelEmbed', `
          <div class="app_card_header">     
              自定義面板標(biāo)題
          </div>
          <div class="app_card_content">     
              自定義面板內(nèi)容
          </div>
          <div class="app_card_footer">     
              footer
          </div>
      `);

傳參格式要求如下:

insertEmbed(index: Number, type: String, value: any, source: String \= 'api'): Delta

這里僅僅這是個簡單的示例,如果想豐富自定義Blot的功能,可以參照: https://github.com/quilljs/parchment#blots

由于contenteditable屬性放開,為了防止造成xss攻擊,所以需要我們對該屬性做特殊的過濾處理,這里以xss模塊處理為例:

handleWithXss(content) {
      const options = {
        whiteList: {
         ...
          div: ['class', 'style', 'data-id','contenteditable'],
         ...
        },
        css: {
          whiteList: {
            color: true,
            'background-color': true,
            'max-width': true,
          },
        },
        stripIgnoreTag: true,
        onTagAttr: (tag, name, value, isWhiteAttr) => {
          // 針對div的contenteditable 處理
          if (isWhiteAttr && tag === 'div' && name === 'contenteditable') {
            return 'contenteditable="false"';
          }
        },
      } // 自定義規(guī)則
      const myxss = new xss.FilterXSS(options)
      return myxss.process(content)
    }

到此這篇關(guān)于Quill編輯器插入自定義HTML記錄的文章就介紹到這了,更多相關(guān)Quill編輯器自定義HTML內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

標(biāo)簽:山南 內(nèi)蒙古 陜西 廣安 上海 保定 清遠(yuǎn) 吳忠

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Quill編輯器插入自定義HTML記錄的示例詳解》,本文關(guān)鍵詞  Quill,編輯器,插入,自定義,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Quill編輯器插入自定義HTML記錄的示例詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Quill編輯器插入自定義HTML記錄的示例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产91精品对白在线播放| 中文字幕の友人北条麻妃| 欧美一级二级三级蜜桃| 欧美在线一区二区三区四区| 亚洲精品日韩综合观看成人91| 2021天堂中文幕一二区在线观| 国产欧美一区二区三区久久| 日本亚洲自拍| 91精品国产66| 999大胆视频| av电影在线免费| 国产精品久久久一区麻豆最新章节| 在线免费黄色毛片| 99精品在线| 成人台湾亚洲精品一区二区| 黄色片网站免费在线观看| 十九岁完整版在线观看好看云免费| 成年人视频免费在线观看| 在线观看精品视频| 痴汉一区二区三区| 日本aⅴ精品一区二区三区| 亚洲蜜桃精久久久久久久| 三级黄在线观看| 91色p视频在线| 久久亚洲综合色一区二区三区| 中文字幕在线免费观看视频| 久久久综合九色合综国产精品| 亚洲欧洲在线一区| 91亚洲精品视频| 四季av日韩精品一区| 国产精品扒开腿做爽爽爽的视频| 亚洲精品免费av| 国产成人精品免费视频| 亚洲精品之草原avav久久| 国产精品毛片久久久久久久久久99999999| 国产精品日本一区二区三区在线| 这里只有精品视频在线| 粗暴蹂躏中文一区二区三区| 亚洲一区二区三区四区在线| 国产毛片久久久久| 精品久久久久久久久久久下田| 欧美一级精品片在线看| 欧美日韩二区三区| 成人免费毛片日本片视频| 国产精品一区二区三区四区五区| 亚洲一区二区三区视频在线| 中文字幕2019第三页| 欧美成人中文字幕在线| 亚洲国产精品va在线观看黑人| 午夜时刻免费入口| 女人丝袜激情亚洲| 在线观看欧美日韩电影| 性高潮免费视频| 无码人妻精品一区二区| 国产一区二区三区精彩视频| 成人在线播放网址| 国产色a在线| 欧洲精品国产| 色99之美女主播在线视频| 精品国产123| 精品一区二区三区五区六区| 久久精品国产精品亚洲色婷婷| 一区二区国产精品精华液| 欧美理论片在线观看| 天堂资源最新版在线视频观看免费网| 亚洲精品亚洲人成人网| 国产高清精品二区| 成+人+亚洲+综合天堂| 亚洲欧美在线高清| 色欲狠狠躁天天躁无码中文字幕| 欧美一级一区二区三区| 日韩欧美一区二区三区视频| 午夜久久久久久久久| 久久久久久久久网站| 精品国产av一区二区| 日日躁夜夜躁白天躁晚上躁91| 日韩高清一二三区| 日本亚洲色大成网站www久久| 91桃色在线观看| 青青草偷拍视频| 97碰碰碰免费公开在线视频| 久久国产精品72免费观看| 国产精品一区二区久久久久| 91黄色免费版| 亚洲欧美一区二区三区在线观看| 精品成人久久久| 午夜美女久久久久爽久久| 天堂中文最新版在线中文| 免费视频中文字幕| 在线观看不卡一区| 欧美亚洲免费高清在线观看| 成年人网站国产| 丁香花在线影院| 肉丝袜脚交视频一区二区| 超碰在线首页| 国产精品久久久视频| 精品国产午夜| 亚洲最大成人在线观看| 在线成人av网站| 中文字幕日韩久久| 2022国产麻豆剧果冻传媒剧情| 欧美日韩国产在线一区| 国产一区二区三区在线看麻豆| 不卡在线一区| 第九区2中文字幕| 新的色悠悠久久久| 欧美成人午夜影院| 九九九九九精品| 免费一级黄色录像| 韩国av一区| eeuss影院www影院| 青青草自拍偷拍| 成人免费视频观看| 国产伦精品一区二区三区照片91| 国产日韩网站| 色婷婷精品大视频在线蜜桃视频| 在线永久免费观看黄网站| 97久精品国产片一区二区三区| 色在线观看视频| 国产精品久久久久久久久久新婚| 亚洲精品av在线播放| 91av资源在线| 久久久国产精品不卡| 久久99久久精品| 中文字幕在线视频日韩| 午夜欧美精品| 国产亚洲永久域名| 伊人影院综合在线| 国产二区视频在线| 亚洲av无码一区二区二三区| 一区二区三区蜜桃网| 国产大陆精品国产| 国产精品久久久久久亚洲调教| 国产中文字幕二区| 一级片免费网站| 久久久久久久9999| 成人免费高清视频在线观看| 国产成人精品综合久久久| 亚洲视频在线一区| 欧美激情亚洲精品| 无码人妻丰满熟妇区毛片18| 欧美极品少妇xxxxⅹ喷水| 在线观看av影片| 永久免费看片在线观看| 欧美日韩美女一区二区| 中文字幕专区| 在线播放国产一区二区三区| 性欧美成人播放77777| 国产黄色av片| 国产欧美一二三区| 亚洲色成人网站www永久四虎| 亚洲色图国产| 国产一区二区美女诱惑| 天天想你在线观看完整版电影免费| 免费黄色一级网站| 国产精品一区二区6| 欧美一级淫片| 色一情一乱一伦一区二区三区日本| 国产精品福利无圣光在线一区| 欧美黄色大片在线观看| 搜索黄色一级片| 成人在线免费观看av| 久久精品视频亚洲| 国产美女性感在线观看懂色av| 久久草在线视频| 91免费看`日韩一区二区| 国自产拍在线网站网址视频| 美女视频黄a视频全免费观看| 亚洲日本中文| 原创真实夫妻啪啪av| 亚洲国产成人va在线观看天堂| 成人影院www在线观看| 国产福利在线观看视频| 在线不卡中文字幕播放| 天堂网在线.www天堂在线| 日日夜夜精品| 污污网址在线观看| 国产免费一区二区三区在线能观看| 人人插人人干| 欧美日韩成人综合在线一区二区| 国产一区二区精品| 麻豆九一精品爱看视频在线观看免费| 国产精品成人va在线观看| 电影eeuss影院www| 久久精品国产免费观看| 人人干狠狠干| 亚洲毛片在线播放| 日韩精品亚洲专区| 欧美孕妇孕交xxⅹ孕妇交| 国产亚洲一级| 国产精品久久久久久中文字| 最近国语视频在线观看免费播放| 一区二区三视频| 99视频这里有精品| 国产一级做a爰片久久| 日韩精品久久一区| 国产精品高潮呻吟视频| 日本55丰满熟妇厨房伦| 91sao在线观看国产| 最新欧美色图| 国产经典视频一区| 1区1区3区4区产品乱码芒果精品| 日韩精品极品在线观看| 亚洲精品自产拍在线观看app| 久久久久网站| 视频福利一区| 国产一级爱c视频| 国产精品萝li| 热99re久久精品精品免费| 欧美吻胸吃奶大尺度电影| 97国产精品久久久| 日韩精品国产一区| а√天堂8资源在线| 久久99精品国产99久久6尤物| 国产探花在线精品一区二区| 欧美xxxx做受欧美护士| 亚洲精品18在线观看| 亚洲婷婷国产精品电影人久久| 最近中文字幕mv免费高清视频8| 欧美精品一区二区在线观看| 久久久久99精品成人片毛片| 一本色道久久综合亚洲二区三区| 国产成人夜色高潮福利影视| 国产精品久久久久久户外露出| 欧美日韩在线成人| 国产精品亚洲第一区在线暖暖韩国| 欧美韩国日本不卡| 欧美精品欧美精品系列| 在线亚洲人成| 国产嫩草在线视频| 欧美日韩国产中文字幕在线| 91在线精品一区二区| 精品美女久久久久久免费| 亚洲AV无码精品色毛片浪潮| 轻点好疼好大好爽视频| 一级做a爰片毛片| 欧洲成人在线视频| 亚洲一区二区三区av无码| www.5588.com毛片| 日本免费一区二区三区等视频| 亚洲日本成人| 美女写真理伦片在线看| 老司机av在线免费看| 免费国产自久久久久三四区久久| 欧美日韩国产激情| 男女裸体影院高潮| 欧美jizzhd精品欧美满| 四虎永久在线高清国产精品| 51av在线| 一区中文字幕| 日本三级在线电影| 国产日韩欧美自拍| 国产精品色午夜在线观看| 国产视频97| 一区二区日韩欧美| 在线观看视频中文字幕| 国产精品99精品一区二区三区∴| 国产欧美久久久| av电影免费在线| aaaa欧美| 国产亚洲福利社区| 91老师国产黑色丝袜在线| 国产在线视频在线观看| 亚洲国产精品一区二区www在线| 久久精品资源| 国产精品无码一本二本三本色| 亚洲高清在线精品| 欧美另类xxx| 一根才成人网| 中文字幕在线播放一区二区| 蜜桃av一区二区在线观看| 成年人三级黄色片| 91原创国产| 爱爱精品视频| 无码人妻精品一区二区三应用大全| 国产一区二区久久| 亚洲春色一区二区三区| 18禁一区二区三区| 亚洲国产天堂久久综合网| 国产精品熟妇一区二区三区四区| 制服丝袜中文字幕在线观看| 人妻换人妻仑乱| 色婷婷亚洲mv天堂mv在影片| 久久久久亚洲精品国产| 日韩欧美在线网址| 丁香花在线高清完整版视频| 久无码久无码av无码| 性xxxx奶大欧美高清| 色天天综合狠狠色| 午夜激情久久久| 日韩高清不卡一区二区三区| 国产美女无遮挡永久免费| 9l视频自拍九色9l视频成人| 国产视频福利一区| 精品婷婷色一区二区三区蜜桃| 色爱区成人综合网| 日韩欧美黄色片| 国产主播福利| 无码黑人精品一区二区| 精品一区二区三区久久| 日韩免费不卡av| 亚洲一区中文字幕在线| 欧美热在线视频精品999| 亚洲欧美激情国产综合久久久| 久久久久久久久久久99999| 欧美极品jizzhd欧美仙踪林| 国产精品久久久久久久久久久久冷| 青青视频在线播放| 在线一区二区三区| 国产亚洲欧美日韩精品一区二区三区| 西野翔中文久久精品国产| 国产精品久久久久久吹潮| 国产香蕉一区二区三区在线视频| 亚洲色成人网站www永久四虎| 中文字幕在线一区二区三区| 蜜桃特黄a∨片免费观看| 自拍偷拍21p| 日韩成人黄色av| 中文在线免费二区三区| 成人综合婷婷国产精品久久| 人人超在线公开视频| 香蕉成人啪国产精品视频综合网| 最新eeuss影院在线观看| y4480在线8影院| 菠萝菠萝蜜网站| 最新中文乱码字字幕在线| 波多野结衣av无码| 午夜在线视频观看|