electron+vue實現(xiàn)div contenteditable截圖功能
最近在學習基于electron + electron-vue開發(fā)聊天客戶端項目時,需要用到編輯器插入表情功能。一般通過input或textarea也能實現(xiàn),通過插入[笑臉]、(:12 這些標簽,展示的時候解析標簽就行。
如下圖效果:
在網(wǎng)上找到的jq插件實現(xiàn)在textarea光標處插入表情符標簽
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <link rel="stylesheet"> </head> <body> <div class="container"> <div class="row"> <div class="col col-sm-12"> <button class="btn btn-success" data-emoj="[笑臉]">[笑臉]</button> <button class="btn btn-success" data-emoj="[奮斗]">[奮斗]</button> <button class="btn btn-success" data-emoj="[:17]">[:17]</button> </div> <div class="col col-sm-12"> <textarea class="form-control" id="content" rows="10"></textarea> </div> </div> </div> <script src="/a1/uploads/allimg/200110/143S02136-0.jpg"></script> <script> (function ($) { $.fn.extend({ insertEmojAtCaret: function (myValue) { var $t = $(this)[0]; if (document.selection) { this.focus(); sel = document.selection.createRange(); sel.text = myValue; this.focus(); } else if ($t.selectionStart || $t.selectionStart == '0') { var startPos = $t.selectionStart; var endPos = $t.selectionEnd; var scrollTop = $t.scrollTop; $t.value = $t.value.substring(0, startPos) + myValue + $t.value.substring(endPos, $t.value.length); this.focus(); $t.selectionStart = startPos + myValue.length; $t.selectionEnd = startPos + myValue.length; $t.scrollTop = scrollTop; } else { this.value += myValue; this.focus(); } } }); })(jQuery); $("button").on("click", function() { $("#content").insertEmojAtCaret($(this).attr("data-emoj")); }); </script> </body> </html>
可是這種方法并不是我想要的類似微信編輯框插入表情效果。
如是就想到了div模擬 設(shè)置 contenteditable="true"
實現(xiàn)富文本編輯器效果,這種方法是可以實現(xiàn),不過在vue中不能綁定v-model,最后參考一些技術(shù)貼實現(xiàn)了這個功能,一頓操作下來采坑不少,于是就做一些分享記錄吧。
vue中通過給div添加contenteditable=true
屬性實現(xiàn)富文本功能
實現(xiàn)方式:
單獨聲明一個vue組件,chatInput.vue,通過監(jiān)聽數(shù)據(jù)變化并返回父組件。
1、父組件添加v-model
<template> ... <chatInput ref="chatInput" v-model="editorText" @focusFn="handleEditorFocus" @blurFn="handleEditorBlur" /> </template>
import chatInput from './chatInput' export default { data () { return { editorText: '', ... } }, components: { chatInput, }, ... }
2、v-model中傳入的值在子組件prop中獲取
export default { props: { value: { type: String, default: '' } }, data () { return { editorText: this.value, ... } }, watch: { value() { ... } }, }
3、通過監(jiān)聽獲取到的prop值,并將該值賦值給子組件中的v-html參數(shù),雙向綁定就ok了。
chatInput.vue組件
<!-- vue實現(xiàn)contenteditable功能 --> <template> <div ref="editor" class="editor" contenteditable="true" v-html="editorText" @input="handleInput" @focus="handleFocus" @blur="handleBlur"> </div> </template> <script> export default { props: { value: { type: String, default: '' } }, data () { return { editorText: this.value, isChange: true, } }, watch: { value() { if(this.isChange) { this.editorText = this.value } } }, methods: { handleInput() { this.$emit('input', this.$el.innerHTML) }, // 清空編輯器 handleClear() { this.$refs.editor.innerHTML = '' this.$refs.editor.focus() }, // 獲取焦點 handleFocus() { this.isChange = false this.$emit('focusFn') }, // 失去焦點 handleBlur() { this.isChange = true this.$emit('blurFn') }, /** * 光標處插入內(nèi)容 * @param html 需要插入的內(nèi)容 */ insertHtmlAtCaret(html) { let sel, range; if(!this.$refs.editor.childNodes.length) { this.$refs.editor.focus() } if (window.getSelection) { // IE9 and non-IE sel = window.getSelection(); if (sel.getRangeAt && sel.rangeCount) { range = sel.getRangeAt(0); range.deleteContents(); let el = document.createElement("div"); el.appendChild(html) var frag = document.createDocumentFragment(), node, lastNode; while ((node = el.firstChild)) { lastNode = frag.appendChild(node); } range.insertNode(frag); if (lastNode) { range = range.cloneRange(); range.setStartAfter(lastNode); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } } } else if (document.selection && document.selection.type != "Control") { // IE < 9 document.selection.createRange().pasteHTML(html); } this.handleInput() } } } </script> <style> </style>
組件功能已經(jīng)親測,直接一次性拿走使用。
以下是一些參考:
1、vue官方描敘, 自定義組件的v-model:
一個組件上的 v-model 默認會利用名為 value 的 prop 和名為 input 的事件,v-model的值將會傳入子組件中的prop
https://cn.vuejs.org/v2/guide/components-custom-events.html#自定義組件的-v-model
2、vue中div可編輯光標處插入內(nèi)容
https://www.jb51.net/article/177989.htm
https://www.jb51.net/article/146257.htm
electron+vue中實現(xiàn)截圖功能
主要使用的是微信截圖dll,通過node執(zhí)行即可
screenShot() { return new Promise((resolve) => { const { execFile } = require('child_process') var screenWin = execFile('./static/PrintScr.exe') screenWin.on('exit', function(code) { let pngs = require('electron').clipboard.readImage().toPNG() let imgData = new Buffer.from(pngs, 'base64') let imgs = 'data:image/png;base64,' + btoa(new Uint8Array(imgData).reduce((data, byte) => data + String.fromCharCode(byte), '')) resolve(imgs) }) }) },
總結(jié)
以上所述是小編給大家介紹的electron+vue實現(xiàn)div contenteditable截圖功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
欄 目:JavaScript
本文標題:electron+vue實現(xiàn)div contenteditable截圖功能
本文地址:http://mengdiqiu.com.cn/a1/JavaScript/9288.html
您可能感興趣的文章
- 04-02java后端代碼分頁 java后端實現(xiàn)分頁page
- 01-10Echarts實現(xiàn)單條折線可拖拽效果
- 01-10在Vue項目中使用Typescript的實現(xiàn)
- 01-10js實現(xiàn)上傳圖片并顯示圖片名稱
- 01-10Vue中使用Lodop插件實現(xiàn)打印功能的簡單方法
- 01-10echarts實現(xiàn)折線圖的拖拽效果
- 01-10d3.js實現(xiàn)圖形縮放平移
- 01-10小程序簡單兩欄瀑布流效果的實現(xiàn)
- 01-10H5實現(xiàn)手機拍照和選擇上傳功能
- 01-10Echarts實現(xiàn)多條折線可拖拽效果


閱讀排行
本欄相關(guān)
- 04-02javascript點線,點線的代碼
- 04-02javascript潛力,javascript強大嗎
- 04-02javascript替換字符串,js字符串的替換
- 04-02javascript移出,js 移入移出
- 04-02包含javascript舍的詞條
- 04-02javascript并行,深入理解并行編程 豆瓣
- 04-02javascript匿名,js匿名方法
- 04-02javascript警報,JavaScript警告
- 04-02javascript遮蓋,JavaScript遮蓋PC端頁面
- 04-02javascript前身,javascript的前身
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)