前言
感谢雪芹美女提供的素材~
点击按钮进行变量填充其实挺常见的,不同业务也有不同的差异,比如这版本的话,选择了的变量则不嫩选择变成置灰,如果在输入框手动删除此变量,则重新放开此变量的选择,以下是完成后的效果:

基于 vue2 和 elementUI
1、准备两个变量按钮
1 2 3 4 5 6 7
| <el-button v-for="(item, index) in buttonArr" :disabled="item.sel" @click="joinString(item)" :key="index" >{{ item.name }}</el-button >
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| buttonArr: [ { key: '1', name: 'baba1', val: '叫爸爸' }, { key: '2', name: 'baba2', val: '叫爸爸' }, { key: '3', name: 'baba3', val: '叫爸爸' } ],
|
2、创建一个拥有 contenteditable 属性的 div
1 2 3 4 5 6 7 8 9 10 11
| <div oncontextmenu="return false" @paste="validVal" contenteditable="true" ref="appMsgCenterContent" @input="validVal" v-html="innerText" @keyup.delete="validVal" @blur="blurFunc" class="inputHeight" ></div>
|
3、给按钮绑定点击事件和输入框绑定输入、键盘校验事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| joinString (val) { this.insertHtmlAtCaret(val) }
insertHtmlAtCaret (obj) { if (window.getSelection) { if (this.sel.getRangeAt && this.sel.rangeCount) { const el = document.createElement('div') el.innerHTML = '「<a>' + obj.key + '</a>」' const frag = document.createDocumentFragment() let node let lastNode while ((node = el.firstChild)) { lastNode = frag.appendChild(node) } this.range.insertNode(frag) if (lastNode) { this.range = this.range.cloneRange() this.range.setStartAfter(lastNode) this.range.collapse(true) this.sel.removeAllRanges() this.sel.addRange(this.range) }
this.validVal() } } else if (document.selection && document.selection.type !== 'Control') { document.selection.createRange().pasteHTML(obj) } }, validVal () { this.$nextTick(() => { const val = this.$refs.appMsgCenterContent.innerText this.count = +val.length if (this.count > 100) { this.$refs.appMsgCenterContent.innerText = this.$refs.appMsgCenterContent.innerText.slice( 0, 100 ) this.count = 100 }
this.buttonArr.forEach((item, index) => { const str = `「${item.key}」` const reg = RegExp(str) this.buttonArr[index] ['sel']=reg.test(val)??false }) }) },
|
4、给输入框绑定失焦事件
1 2 3 4 5
| blurFunc (textObj) { this.sel = window.getSelection() this.range = this.sel.getRangeAt(0) this.range.deleteContents() },
|