textarea与标签组合,点击标签填入标签内容,再次点击删除内容(vue)
需求:将textarea与span标签组合,点击标签自动填入标签文本内容,再次点击删除标签文本对应内容

原理:点击标签时,将标签内容作为参数,将内容拼接在textarea的value后面,再次点击标签,使用js的replace替换(这里只能替换找到的第一个与标签内容相同的值)
实现代码如下:
<template>
<div class="relative-element">
<textarea v-model="myForm.remark" type="textarea" :maxlength="300" placeholder="请输入备注,300字以内"></textarea>
<div class="bottom-labels" ref="remarkLabels">
<span title="九零后" @click.stop="autoFillIn('九零后', $event)">九零后</span>
<span title="小说迷" @click.stop="autoFillIn('小说迷', $event)">小说迷</span>
<span title="天真无邪" @click.stop="autoFillIn('天真无邪', $event)">天真无邪</span>
<span title="可爱迷人" @click.stop="autoFillIn('可爱迷人', $event)">可爱迷人</span>
<span title="帅气逼人" @click.stop="autoFillIn('帅气逼人', $event)">帅气逼人</span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
myForm: {
remark: '小说迷 '
}
}
},
mounted() {
this.initLabelsCheck(this.myForm.remark);
},
methods: {
// textarea初始化(标签根据内容是否选中)
initLabelsCheck(remark) {
if(remark){
let remarkArr = remark.split(" ");
if(remarkArr.length > 0 && this.$refs.remarkLabels){
let labels = this.$refs.remarkLabels.querySelectorAll("span");
for(let i=0; i<remarkArr.length; i++){
for(let l=0; l<labels.length; l++) {
if(remarkArr[i].trim()!=='' && remarkArr[i] === labels[l].getAttribute("title")){
labels[l].classList.add('active');
}
}
}
}
}
},
// textarea点击标签自动填入
autoFillIn(text, event){
let target = event.target;
if(target.classList.contains("active")){
// 再次点击删除
text = text + " ";
this.myForm.remark = this.myForm.remark.replace(text, '');
} else {
if(this.myForm.remark.length === 0){
this.myForm.remark += text + " ";
} else {
this.myForm.remark = this.myForm.remark.trim() + " " + text + " ";
}
}
target.classList.toggle("active");
}
}
}
</script>
<style lang="scss" scoped>
.relative-element {
position: relative;
margin: 30px 40px;
width: 400px;
textarea {
display: block;
padding: 5px 15px;
width: 100%;
height: 150px;
resize: vertical;
line-height: 1.5;
box-sizing: border-box;
font-size: inherit;
color: #606266;
background-color: #fff;
border: 1px solid #dcdfe6;
border-radius: 4px;
transition: border-color .2s cubic-bezier(.645,.045,.355,1);
}
.bottom-labels {
position: absolute;
left: 10px;
right: 10px;
bottom: 3px;
line-height: 18px;
background-color: #fff;
user-select: none; span {
display: inline-block;
margin: 0 3px;
padding: 0 6px;
font-size: 12px;
background-color: #f3f3f3;
vertical-align: middle;
&:hover {
cursor: pointer;
}
&.active {
color: #29e;
}
}
}
}
</style>
textarea与标签组合,点击标签填入标签内容,再次点击删除内容(vue)的更多相关文章
- Html : 点击按钮弹出输入框,再次点击进行隐藏
上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- 点击按钮改变div背景色,再次点击恢复 -- 原生JS
如果对您有帮助,记得点个赞哦!
- 初学ToggleButton 点击button,更换button背景图片;再次点击,恢复之前背景图
上方的图标,R.drawable.register_checked 是选中图片 下方的图标, R.drawable.register_unchecked 是未选中图片 默认是上方的选中效果.点击 ...
- ThinkPHP框架下,给jq动态添加的标签添加点击事件移除标签
jq移除标签主要就是$("#要移除的id").remove();不再赘述,这里要提醒的是jq中动态添加标签后怎样添加点击事件.一般的jq添加点击事件是用这种方法$("#i ...
- 点击事件获得li标签内容
通过点击事件获得li标签内容 Table of contents 随笔 随笔 <li onclick="liClick(this)">数据</li> //点 ...
- 点击对应的a标签返回相应的第几个
面试中遇到的问题,前两天一直没有解决,今天想想还是得要想办法才行,其实仔细想的话很简单,惭愧啊,面试的时候没有做出来! 题目是这样的,如果一个body中有5个a标签,当我们点击对应的a标签时,aler ...
- jq再次封装自己的ajax & js 回调函数 & js方法注释&js 全局屏蔽点击事件及a标签
1.封装成一个独立JS var commonUrl = 'http://xx.xxx.com/'; function http({ url, type = "post", data ...
- JAVAWEB开发之JSTL标签库的使用、 自己定义EL函数、自己定义标签(带属性的、带标签体的)
JSTL JSTL简单介绍: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用: 提供给Java Web开发者一个标准通用的标签函数库 和E ...
- JSP标准标签库(JSTL)之核心标签(下)
前面记录了核心标签的前几种,现在来接着记录. 七.<c:import>标签 使用<c:import>标签可以包含一个FTP服务器中不同的网页内容.语法格式: <c:i ...
随机推荐
- 【转载】 tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数
原文地址: https://blog.csdn.net/dcrmg/article/details/79776876 ----------------------------------------- ...
- Spring5源码分析之启动类的相关接口和注解
一些基础但是核心的知识总结: Spring Boot项目启动的时候需要加@Configuration. @ComponentScan @Configuration + @Bean 把第三方jar包注入 ...
- 泡泡一分钟:eRTIS - A Fully Embedded Real Time 3D Imaging Sonar Sensor for Robotic Applications
eRTIS - A Fully Embedded Real Time 3D Imaging Sonar Sensor for Robotic Applications eRTIS - 用于机器人应用 ...
- no match for call to ‘(std::__cxx11::string {aka std::__cxx11::basic_string
问题: t->package().ship_id(sqlRow[1]);其中 ship_id为 结构体package中的string类型.如下: typedef struct Package{ ...
- 全面系统Python3入门+进阶-1-2 Python的特性
结束
- matlab基本函数randperm end数组索引
一起来学演化计算-matlab基本函数randperm end数组索引 觉得有用的话,欢迎一起讨论相互学习~Follow Me 随机排列 语法 p = randperm(n) p = randperm ...
- springboot 整合 Froala Editor 3
springboot项目中使用 Froala Editor 3,参考官网文档:https://www.froala.com/wysiwyg-editor/docs/overview 下载文件后,引入c ...
- POJ 2342 Anniversary party 树形DP基础题
题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...
- IE浏览器提示打印控件未安装的一些原因
打印控件未安装!点击这里执行安装,安装后请刷新页面或重新进入.--该提示是写在LodopFuncs.js里的.相关本博客其他博文:提示“Web打印服务CLodop未安装启动”的各种原因和解决方法.C- ...
- web端自动化——python多线程
Python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的.原始的线程以及一个简单的锁.threading基于Java的线程模型设计. 锁(Lock)条件变 ...