日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

Vue-html5-editor 编辑器的使用及一些问题解决

發布時間:2023/12/18 vue 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Vue-html5-editor 编辑器的使用及一些问题解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

近期由于需要對公司運營系統進行優化和升級,而原有后臺系統所使用的vue-quill-editor編輯器對粘貼進來的內容的行內樣式全部進行了過濾,雖然這樣可以防止XSS攻擊,但是卻完全無法滿足業務需要,為此對編輯器進行了更換,采用Vue-html5-editor 這個編輯器。

這是一個基于Vue 2.0系列的編輯器(官方地址),還不錯,但卻存在一些問題,以下記錄這些問題,并提供解決辦法。

1. 復制網絡圖片時無法粘貼成功

主要原因是圖片鏈接存在跨域問題。運營人員復制的內容都是基于微信環境的,微信對所有的圖片鏈接地址加了crossorigin="anonymous",所以復制圖片的時候無法正常顯示出來。

解決的辦法是在編輯器的更新事件觸發時,對所有的img圖片鏈接中的crossorigin="anonymous"替換為空,代碼如下:

// 更新編輯器內容 updateData(){let obj = document.getElementsByClassName("content")[0];let html = obj.innerHTML;let filterHtml = html.replace(/crossorigin="anonymous"/g,"");this.content = filterHtml;// 編輯器封裝后,將內容傳出去this.$emit('contentChange',filterHtml); },

2. 無法從已有的圖庫中選擇圖片

此編輯器插入圖片的方式主要有兩種,一是輸入鏈接插入圖片,二是選擇本地的圖片轉成base64后插入圖片。

很顯然,沒法使用公司已經有素材庫的圖片,為此需要對該編輯器的源碼做一些修改, 主要修改如下:

1. 將“上傳”改為“選擇”。修改文件 vue-html5-editor.js ,大約在310行的 template$3 變量中;

?

2. 將以前觸發上傳的事件改為觸發一個打開選擇圖片的模態框,以便選擇圖庫中的圖片。修改文件vue-html5-editor.js ,大約在343行的pick事件中;

pick: function pick() {// 取消觸發上傳圖片的事件// this.$refs.file.click();// 自定義的觸發圖片選擇模態框的事件this.$parent.$parent.openModal();},

?以下是圖片選擇的模態框展示:?

3. 由于從圖庫中選擇圖片獲取的僅僅是一個圖片的鏈接地址,最終也是要以圖片的形式插入編輯器中的,而編輯器插入圖片的功能本身是比較OK的,為了省事,決定借用編輯器的插入圖片功能,所以定義了一個事件,用于接收選擇的圖片地址,然后將圖片的鏈接地址賦給編輯器自帶的插入圖片的輸入鏈接框中,然后點擊“確定”就可以插入圖片了;

?代碼如下:

// 選擇的圖片地址 selectedImageUrl(url){let obj = this.$refs.editor.$children;// imageUrl為編輯器原有的變量obj[0].imageUrl = url; },

3. 插入的圖片沒有做寬度限制

由于圖庫中有些圖片的尺寸比較大,會超出編輯器的總寬度,導致排版比較難看,為此在插入新圖片時,需要給圖片加一個行內樣式,即寬度為百分百。

設置圖片寬度的代碼如下:

// 設置圖片寬度 setImageWidth(){this.$nextTick(()=>{let list = document.querySelectorAll(".vue-html5-editor .content img");if(list.length){for(let i=0;i<list.length;i++){let img = list[i];img.style.width = "100%";}};}); }

?同時在編輯器插入圖片的事件中調用上面這個方法,修改文件vue-html5-editor.js ,大約在 333 行的 insertImageUrl 事件中,代碼如下:

insertImageUrl: function insertImageUrl() {if (!this.imageUrl) {return}this.$parent.execCommand(Command.INSERT_IMAGE, this.imageUrl);// 對新插入的圖片設置圖片最大寬度this.$parent.$parent.setImageWidth();this.imageUrl = null; },

4. 給圖片加超鏈接

由于在富文本里是有很多圖片是要加超鏈接的,這個編輯器提供的加超鏈接是真心不好用,需要用鼠標選中文本或是圖片才能加超鏈接,運營人員反映相當麻煩,而且加了鏈接也看不到是否加成功了的標識。

實現思路如下:

1. 在編輯器的內容更新時,給富文本中所有的圖片加上一個data-index,并同時加上點擊事件。當點擊當前圖片時,獲取當前圖片的HTML、自定義的data-index,同時獲取當前圖片的父元素,如果當前圖片的父元素是已經加了鏈接的A標簽,則獲取A標簽的鏈接地址以方便修改;

// 給圖片添加事件 addImgEvent(){let imgs = document.querySelectorAll(".vue-html5-editor img");for(let i=0;i<imgs.length;i++){let img = imgs[i];img.style.cursor="pointer";img.setAttribute("data-index",i);img.onclick = (e)=>{// 顯示加鏈接的對話框this.showImgLinkModal = true;// 區取當前圖片的HTMLthis.imgTarget = e.target.outerHTML;// 獲取當前圖片自定義的indexthis.imgIndex = e.target.getAttribute("data-index");// 獲取當前元素的父元素let parent = e.target.parentElement;// 如果圖片的父元素是已經加了鏈接的A標簽if(parent.tagName=='A'){// 獲取A標簽的鏈接地址,方便修改鏈接地址this.imgLink = parent.getAttribute("href");}}} },

2. 確認添加圖片鏈接時,根據當前圖片是否已經添加了鏈接來做不同的處理。如果沒有加鏈接就加上;如果已經加了鏈接,就更新鏈接地址;

// HTML轉換為DOM結點 parseElement(htmlString){return new DOMParser().parseFromString(htmlString,'text/html').body.childNodes[0]; },// 確認添加圖片鏈接 confirmAddLink(){// 加了鏈接的標識符let span = '<span id="linkMark" style="width: 26px;height: 26px;display: block;position: absolute;top: 5px;right: 5px;background: url(data:image/png;base64,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) no-repeat center;background-size: contain; "></span>';// 當前圖片let img = this.imgTarget;// 圖片添加鏈接后的HTMLlet a = '<a style="position:relative;display:block" href="'+this.imgLink+'">'+span+img+'</a>';// 將HTML轉換為節點類型let spanNode = this.parseElement(span);let aNode = this.parseElement(a);// 獲取當前圖片let index = this.imgIndex;let imgs = document.querySelectorAll(".vue-html5-editor img");let current = imgs[index];let children = current.parentNode.children;// 如果當前圖片父元素不是A標簽if(current.parentNode.tagName!='A'){for(let i=0;i<children.length;i++){let item = children[i];// 如果子節點中的某一個節點等于當前圖片對象if(item.isEqualNode(current)){// 將加了鏈接的圖片添加到當前節點下一個節點之前current.parentNode.insertBefore(aNode, item.nextSibling);// 移除沒有加鏈接的圖片current.parentNode.removeChild(item);break;}};}else{let link = this.imgLink;// 重新給當前圖片的父元素A標簽設置可能更改的鏈接current.parentNode.setAttribute("href",link);// 給富文本中的圖片本身存在鏈接設置樣式,防置鏈接是原有的current.parentNode.setAttribute("style","position:relative;display:block");let hasLinkMark=false;// 判斷是否有鏈接標識for(let i=0;i<children.length;i++){let item = children[i];if(item!=current ){if(item.tagName=='SPAN' && item.id=="linkMark"){hasLinkMark=true;}else{current.parentNode.removeChild(item); }}};// 如果沒有鏈接標識if(!hasLinkMark){// 添加一個鏈接標識current.parentNode.insertBefore(spanNode,children[0]);}};// 關閉添加鏈接的模態框this.closeImgLinkModal();// 更新圖片事件this.addImgEvent();this.$nextTick(()=>{let result = document.querySelectorAll(".content")[0].innerHTML;this.data.content = result;});},

3. 關閉圖片添加鏈接的模態框;

// 關閉插入圖片鏈接模態框 closeImgLinkModal(){this.showImgLinkModal = false;this.imgTarget = null;this.imgIndex = null;this.imgLink = ""; },

以下是加了鏈接的效果:

5. 代碼實現

以下是封裝好的編輯器文件代碼。

<template><div><vue-html5-editor ref="editor":height="960" :content="content" :auto-height="false" @change="updateData"></vue-html5-editor></div> </template><script> // npm install font-awesome --save import "font-awesome/css/font-awesome.css" export default {name:"editor",props: {// 打開圖片選擇框openModal:{type:Function}},data() {return {content:"",}},mounted(){},methods: {// 更新編輯器內容updateData(){let obj = document.getElementsByClassName("content")[0];let html = obj.innerHTML;let filterHtml = html.replace(/crossorigin="anonymous"/g,"");this.content = filterHtml;// 編輯器封裝后,將內容傳出去this.$emit('contentChange',filterHtml);},// 選擇的圖片地址selectedImageUrl(url){let obj = this.$refs.editor.$children;// imageUrl為編輯器原有的變量obj[0].imageUrl = url;},// 設置圖片寬度setImageWidth(){this.$nextTick(()=>{let list = document.querySelectorAll(".vue-html5-editor .content img");if(list.length){for(let i=0;i<list.length;i++){let img = list[i];img.style.width = "100%";}};});}}, } </script>

以下是調用編輯器的文件代碼,相關無用代碼已經做了清除,可根據需要自行添加。

<template><div><!-- 調用編輯器 --><div class="editor-box"><my-editor ref="myEditor" @contentChange="contentChange" :openModal="openModal"></my-editor></div><!-- 圖片素材庫--><el-dialog title="選擇圖片" :visible.sync="showSelectImgModal" @close="closeModal" width="960px"><div class="img-modal"><div class="image-list"><el-uploadname="img"class="avatar-uploader"style="width:100px;height:100px;":multiple="false":headers="headers":action="uploadUrl":data="uploadData":show-file-list="false":on-success="onUploadSuccess":before-upload="onUploadBefore"accept=".jpg,.jpeg,.png,.gif,.bmp,.JPG,.JPEG,.PBG,.GIF,.BMP"><i class="el-icon-plus avatar-uploader-icon"></i></el-upload><div class="image-item" v-for="item in imageList" :key="item.id" @click="selectImage(item.path)"><el-image fit="cover" :src="item.path"></el-image></div></div></div> </el-dialog><!-- 插入鏈接--><el-dialog title="插入鏈接" :visible.sync="showImgLinkModal" @close="closeImgLinkModal" width="800px"><div style="display:flex;"><el-input placeholder="請輸入圖片鏈接地址" v-model="imgLink"></el-input><el-button type="primary" style="margin-left:10px;" @click="confirmAddLink">確定</el-button></div></el-dialog></div></template><script> // 引入封裝后的編輯器組件 import editor from './components/editor'; // 引入獲取Token的方法 import { getToken } from '@/utils/auth';export default {name: "myEditor",components:{'myEditor':editor},data() {return {// 編輯器的內容content:"",// 打開顯示圖庫showSelectImgModal:false,// 圖庫圖片列表imageList:[],// 上傳圖片地址(模擬)uploadUrl:"http://www.upload.com",// 上傳圖片驗證headers: {authorization: getToken()},// 上傳附加參數uploadData:{},// 添加鏈接showImgLinkModal:false,// 當前圖片imgTarget:null,// 圖片下標imgIndex:null,// 圖片鏈接imgLink:"",};},created(){// 獲取圖片素材庫this.getImage();},mounted(){},methods: {// 內容更新時contentChange(result){this.content = result;this.$nextTick(()=>{// 內容更新時給圖片加事件this.addImgEvent();});},// 打開選擇圖片openModal(){this.showSelectImgModal = true;},// 獲取微信圖片getImage(){// 獲取圖庫的接口中地址(模擬)let url = "getWechatImage";this.$http.get(url).then((result) => {if (result.code == 10000) {this.imageList = result.data;}});},// 上傳以前onUploadBefore(file){const size = file.size / 1024 / 1024;if (size>10){this.$message.error('圖片大小不能超過10MB');return false}},// 上傳成功后onUploadSuccess(res){if(res.code==10000){// 重新獲取圖片庫的圖片this.getImage();}},// 選擇圖庫圖片selectImage(url){this.$refs.myEditor.selectedImageUrl(url);this.closeModal();},// 關閉選擇圖片closeModal(){this.showSelectImgModal = false;},// 給圖片添加事件addImgEvent(){let imgs = document.querySelectorAll(".vue-html5-editor img");for(let i=0;i<imgs.length;i++){let img = imgs[i];img.style.cursor="pointer";img.setAttribute("data-index",i);img.onclick = (e)=>{// 顯示加鏈接的對話框this.showImgLinkModal = true;// 區取當前圖片的HTMLthis.imgTarget = e.target.outerHTML;// 獲取當前圖片自定義的indexthis.imgIndex = e.target.getAttribute("data-index");// 獲取當前元素的父元素let parent = e.target.parentElement;// 如果圖片的父元素是已經加了鏈接的A標簽if(parent.tagName=='A'){// 獲取A標簽的鏈接地址,方便修改鏈接地址this.imgLink = parent.getAttribute("href");}}}},// 關閉插入圖片鏈接模態框closeImgLinkModal(){this.showImgLinkModal = false;this.imgTarget = null;this.imgIndex = null;this.imgLink = "";},// HTML轉換為DOM結點parseElement(htmlString){return new DOMParser().parseFromString(htmlString,'text/html').body.childNodes[0];},// 確認添加圖片鏈接confirmAddLink(){// 加了鏈接的標識符let span = '<span id="linkMark" style="width: 26px;height: 26px;display: block;position: absolute;top: 5px;right: 5px;background: url(data:image/png;base64,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) no-repeat center;background-size: contain; "></span>';// 當前圖片let img = this.imgTarget;// 圖片添加鏈接后的HTMLlet a = '<a style="position:relative;display:block" href="'+this.imgLink+'">'+span+img+'</a>';// 將HTML轉換為節點類型let spanNode = this.parseElement(span);let aNode = this.parseElement(a);// 獲取當前圖片let index = this.imgIndex;let imgs = document.querySelectorAll(".vue-html5-editor img");let current = imgs[index];let children = current.parentNode.children;// 如果當前圖片父元素不是A標簽if(current.parentNode.tagName!='A'){for(let i=0;i<children.length;i++){let item = children[i];// 如果子節點中的某一個節點等于當前圖片對象if(item.isEqualNode(current)){// 將加了鏈接的圖片添加到當前節點下一個節點之前current.parentNode.insertBefore(aNode, item.nextSibling);// 移除沒有加鏈接的圖片current.parentNode.removeChild(item);break;}};}else{let link = this.imgLink;// 重新給當前圖片的父元素A標簽設置可能更改的鏈接current.parentNode.setAttribute("href",link);// 給富文本中的圖片本身存在鏈接設置樣式,防置鏈接是原有的current.parentNode.setAttribute("style","position:relative;display:block");let hasLinkMark=false;// 判斷是否有鏈接標識for(let i=0;i<children.length;i++){let item = children[i];if(item!=current ){if(item.tagName=='SPAN' && item.id=="linkMark"){hasLinkMark=true;}else{current.parentNode.removeChild(item); }}};// 如果沒有鏈接標識if(!hasLinkMark){// 添加一個鏈接標識current.parentNode.insertBefore(spanNode,children[0]);}};// 關閉添加鏈接的模態框this.closeImgLinkModal();// 更新圖片事件this.addImgEvent();this.$nextTick(()=>{let result = document.querySelectorAll(".content")[0].innerHTML;this.data.content = result;});}}, }; </script><style lang="scss" scoped>.editor-box{width:718px;height:1000px;overflow:hidden; }.img-modal{width:100%;height:600px;overflow-y: auto;.image-list{width:100%;display: flex;flex-direction: row;justify-content: flex-start;flex-wrap: wrap;align-items: flex-start;.image-item{height:100px;width:100px;overflow: hidden;display: flex;flex-direction:column;justify-content:space-around;align-items:center;.el-image{width:100%;height:100%;cursor: pointer;}}} }</style>

以下是上面代碼中獲取Token的文件代碼:

// npm inatall js-cookie --save import Cookies from 'js-cookie'const TokenKey = 'Admin-Token'export function getToken() {return Cookies.get(TokenKey) }export function setToken(token) {return Cookies.set(TokenKey, token) }export function removeToken() {return Cookies.remove(TokenKey) }

?如果上面的文件作為編輯素材時,可以用下面的代碼對編輯器進行初始賦值。

this.$refs.myEditor.content = "要賦值的富文本"; // 設置內容中圖片的寬度 this.$refs.myEditor.setImageWidth();

最后是在main.js中集成編輯器的代碼。

// npm install vue-html5-editor --save import VueHtml5Editor from 'vue-html5-editor' var options = {// 全局組件名稱,使用new VueHtml5Editor(options)時該選項無效 name: "vue-html5-editor",// 是否顯示模塊名稱,開啟的話會在工具欄的圖標后臺直接顯示名稱showModuleName: false,// 自定義各個圖標的class,默認使用的是font-awesome提供的圖標icons: {text: "fa fa-pencil",color: "fa fa-paint-brush",font: "fa fa-font",align: "fa fa-align-justify",list: "fa fa-list",link: "fa fa-chain",unlink: "fa fa-chain-broken",tabulation: "fa fa-table",image: "fa fa-file-image-o",hr: "fa fa-minus",eraser: "fa fa-eraser",undo: "fa-undo fa",info: "fa fa-info",},// 配置圖片模塊image: {// 文件最大體積,單位字節 max file sizesizeLimit: 512 * 1024,// 上傳參數,默認把圖片轉為base64而不上傳upload: {url: null,headers: {},params: {},fieldName: {}},// 壓縮參數,默認使用localResizeIMG進行壓縮,設置為null禁止壓縮compress: {width: 1600,height: 1600,quality: 80},// 響應數據處理,最終返回圖片鏈接uploadHandler(responseText){var json = JSON.parse(responseText)if (!json.ok) {alert(json.msg)} else {return json.data}}},// 語言,內建的有英文(en-us)和中文(zh-cn)language: "zh-cn",// 自定義語言i18n: {"zh-cn": {"align": "對齊方式","image": "圖片","list": "列表","link": "鏈接","unlink": "去除鏈接","table": "表格","font": "文字","text": "排版","eraser": "格式清除","info": "關于","color": "顏色","please enter a url": "請輸入地址","create link": "創建鏈接","bold": "加粗","italic": "傾斜","underline": "下劃線","strike through": "刪除線","subscript": "上標","superscript": "下標","heading": "標題","font name": "字體","font size": "文字大小","left justify": "左對齊","center justify": "居中","right justify": "右對齊","ordered list": "有序列表","unordered list": "無序列表","fore color": "前景色","background color": "背景色","row count": "行數","column count": "列數","save": "確定","upload": "上傳","progress": "進度","unknown": "未知","please wait": "請稍等","error": "錯誤","abort": "中斷","reset": "重置"}},// 隱藏不想要顯示出來的模塊hiddenModules: [],// 自定義要顯示的模塊,并控制順序visibleModules: ["text","color","font","align","list","link","unlink","tabulation","image","hr","eraser","undo",],// 擴展模塊,具體可以參考examples或查看源碼modules: {} };Vue.use(VueHtml5Editor,options);

總結

以上是生活随笔為你收集整理的Vue-html5-editor 编辑器的使用及一些问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。