前言

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

基于 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) {
// IE9 and non-IE
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)
// Preserve the selection
if (lastNode) {
// 这是第三方api
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') {
// IE < 9
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()
},