最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

electron+vue實(shí)現(xiàn)div contenteditable截圖功能

 更新時(shí)間:2020年01月07日 13:37:56   作者:xiaoyan2017  
這篇文章主要介紹了electron+vue實(shí)現(xiàn)div contenteditable截圖功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

最近在學(xué)習(xí)基于electron + electron-vue開發(fā)聊天客戶端項(xiàng)目時(shí),需要用到編輯器插入表情功能。一般通過input或textarea也能實(shí)現(xiàn),通過插入[笑臉]、(:12 這些標(biāo)簽,展示的時(shí)候解析標(biāo)簽就行。

如下圖效果:

 

在網(wǎng)上找到的jq插件實(shí)現(xiàn)在textarea光標(biāo)處插入表情符標(biāo)簽

<!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="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></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" 實(shí)現(xiàn)富文本編輯器效果,這種方法是可以實(shí)現(xiàn),不過在vue中不能綁定v-model,最后參考一些技術(shù)貼實(shí)現(xiàn)了這個(gè)功能,一頓操作下來采坑不少,于是就做一些分享記錄吧。

vue中通過給div添加contenteditable=true屬性實(shí)現(xiàn)富文本功能

 

實(shí)現(xiàn)方式:

單獨(dú)聲明一個(gè)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實(shí)現(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()
 },
 
 // 獲取焦點(diǎn)
 handleFocus() {
 this.isChange = false
 this.$emit('focusFn')
 },
 // 失去焦點(diǎn)
 handleBlur() {
 this.isChange = true
 this.$emit('blurFn')
 },
 

 /**
 * 光標(biāo)處插入內(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:

一個(gè)組件上的 v-model 默認(rèn)會(huì)利用名為 value 的 prop 和名為 input 的事件,v-model的值將會(huì)傳入子組件中的prop

https://cn.vuejs.org/v2/guide/components-custom-events.html#自定義組件的-v-model
2、vue中div可編輯光標(biāo)處插入內(nèi)容

http://m.fzitv.net/article/177989.htm

http://m.fzitv.net/article/146257.htm

electron+vue中實(shí)現(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實(shí)現(xiàn)div contenteditable截圖功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • vue百度地圖實(shí)現(xiàn)自定義彈框樣式

    vue百度地圖實(shí)現(xiàn)自定義彈框樣式

    這篇文章主要介紹了vue百度地圖實(shí)現(xiàn)自定義彈框樣式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 詳解vue 不同環(huán)境配置不同的打包命令

    詳解vue 不同環(huán)境配置不同的打包命令

    這篇文章主要介紹了詳解vue不同環(huán)境配置不同的打包命令,主要包括正式環(huán)境、測試環(huán)境和開發(fā)環(huán)境,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • vue2.0 中使用transition實(shí)現(xiàn)動(dòng)畫效果使用心得

    vue2.0 中使用transition實(shí)現(xiàn)動(dòng)畫效果使用心得

    這篇文章主要介紹了vue2.0 中使用transition實(shí)現(xiàn)動(dòng)畫效果使用心得,本文通過案例知識(shí)給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2018-08-08
  • 在vue和element-ui的table中實(shí)現(xiàn)分頁復(fù)選功能

    在vue和element-ui的table中實(shí)現(xiàn)分頁復(fù)選功能

    這篇文章主要介紹了在vue和element-ui的table中實(shí)現(xiàn)分頁復(fù)選功能,本文代碼結(jié)合圖文的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Vue3實(shí)現(xiàn)組件拖拽實(shí)時(shí)預(yù)覽功能

    Vue3實(shí)現(xiàn)組件拖拽實(shí)時(shí)預(yù)覽功能

    這篇文章主要介紹了Vue3實(shí)現(xiàn)組件拖拽實(shí)時(shí)預(yù)覽功能,對(duì)于組件拖拽預(yù)覽,用戶可以在含有各種功能組件的列表中,選擇需要的組件進(jìn)行拖拽,需要的朋友可以參考下
    2023-12-12
  • Vue計(jì)算屬性的使用

    Vue計(jì)算屬性的使用

    本篇文章主要介紹了Vue計(jì)算屬性的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • vue如何動(dòng)態(tài)加載組件詳解

    vue如何動(dòng)態(tài)加載組件詳解

    組件是Vue.js最強(qiáng)大的功能之一,組件可以擴(kuò)展HTML元素,封裝可重用的代碼,下面這篇文章主要給大家介紹了關(guān)于vue如何動(dòng)態(tài)加載組件的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 從0搭建vue3組件庫Input組件

    從0搭建vue3組件庫Input組件

    這篇文章主要介紹了從0搭建vue3組件庫Input組件,每個(gè)功能的實(shí)現(xiàn)代碼都做了精簡,方便大家快速定位到核心邏輯,接下來就開始對(duì)這些功能進(jìn)行實(shí)例代碼講解,需要的朋友可以參考下
    2022-11-11
  • vue獲取dom元素注意事項(xiàng)

    vue獲取dom元素注意事項(xiàng)

    這篇文章主要介紹了vue獲取dom元素注意事項(xiàng)及vue獲取dom元素的內(nèi)容,需要的朋友可以參考下
    2017-12-12
  • 解決vue-router進(jìn)行build無法正常顯示路由頁面的問題

    解決vue-router進(jìn)行build無法正常顯示路由頁面的問題

    下面小編就為大家分享一篇解決vue-router進(jìn)行build無法正常顯示路由頁面的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評(píng)論

六枝特区| 来宾市| 敦煌市| 南皮县| 通河县| 景泰县| 托克逊县| 临桂县| 汶上县| 彩票| 株洲县| 海兴县| 松滋市| 双鸭山市| 宁城县| 富蕴县| 凌海市| 桦南县| 淮滨县| 余江县| 栾川县| 拉孜县| 凤庆县| 宜良县| 常山县| 普兰店市| 南充市| 富民县| 左云县| 哈密市| 永济市| 旅游| 喀喇| 吴忠市| 咸阳市| 营口市| 宝鸡市| 榆社县| 隆尧县| 沾益县| 田阳县|