需求:将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)的更多相关文章

  1. Html : 点击按钮弹出输入框,再次点击进行隐藏

    上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  2. 点击按钮改变div背景色,再次点击恢复 -- 原生JS

    如果对您有帮助,记得点个赞哦!

  3. 初学ToggleButton 点击button,更换button背景图片;再次点击,恢复之前背景图

    上方的图标,R.drawable.register_checked  是选中图片 下方的图标,   R.drawable.register_unchecked 是未选中图片 默认是上方的选中效果.点击 ...

  4. ThinkPHP框架下,给jq动态添加的标签添加点击事件移除标签

    jq移除标签主要就是$("#要移除的id").remove();不再赘述,这里要提醒的是jq中动态添加标签后怎样添加点击事件.一般的jq添加点击事件是用这种方法$("#i ...

  5. 点击事件获得li标签内容

    通过点击事件获得li标签内容 Table of contents 随笔 随笔 <li onclick="liClick(this)">数据</li> //点 ...

  6. 点击对应的a标签返回相应的第几个

    面试中遇到的问题,前两天一直没有解决,今天想想还是得要想办法才行,其实仔细想的话很简单,惭愧啊,面试的时候没有做出来! 题目是这样的,如果一个body中有5个a标签,当我们点击对应的a标签时,aler ...

  7. jq再次封装自己的ajax & js 回调函数 & js方法注释&js 全局屏蔽点击事件及a标签

    1.封装成一个独立JS var commonUrl = 'http://xx.xxx.com/'; function http({ url, type = "post", data ...

  8. JAVAWEB开发之JSTL标签库的使用、 自己定义EL函数、自己定义标签(带属性的、带标签体的)

    JSTL  JSTL简单介绍: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用:   提供给Java Web开发者一个标准通用的标签函数库   和E ...

  9. JSP标准标签库(JSTL)之核心标签(下)

      前面记录了核心标签的前几种,现在来接着记录. 七.<c:import>标签 使用<c:import>标签可以包含一个FTP服务器中不同的网页内容.语法格式: <c:i ...

随机推荐

  1. un-资源-开源-WebGallery:Windows Web App Gallery

    ylbtech-资源-开源-WebGallery:Windows Web App Gallery Windows Web App Gallery 1.返回顶部   2.返回顶部   3.返回顶部   ...

  2. openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍

    openresty开发系列2--nginx的简单安装,正向.反向代理及常用命令和信号控制介绍 一.nginx的安装下载及编译安装1.Nginx下载:nginx-1.13.0.tar.gz,下载到:/u ...

  3. ISO/IEC 9899:2011 条款6.5.17——逗号操作符

    6.5.17 逗号操作符 语法 1.expression: assignment-expression expression    ,    assignment-expression 语义 2.一个 ...

  4. 线程池+同步io和异步io(浅谈)

    线程池+同步io和异步io(浅谈) 来自于知乎大佬的一个评论 我们的系统代码从同步方式+线程池改成异步化之后压测发现性能提高了一倍,不再有大量的空闲线程,但是CPU的消耗太大,几乎打满,后来改成协程化 ...

  5. hugepage设置相关总结

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/shaoyunzhe/article/de ...

  6. 【html】window.open()被部分浏览器拦截问题

    一.原因:1.因为在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的: 二.什么情况下不会被拦截或会被拦截? 1. $('#btn').click(function ( ...

  7. mysql的驱动类com.mysql.jdbc.Driver过时了,需要用com.mysql.cj.jdbc.Driver代替

    springboot项目整合mybatis,配置文件如下: server: port: 8081 mybatis: config-location: classpath:mybatis/mybatis ...

  8. IIS+PHP本地开发环境配置

    打开Win7系统自带IIS.如图只要点击两下,CGI一定要勾选上!完成后打开浏览器输入127.0.0.1测试一下,如果能打开页面说明iis开启成功. 安装PHP.不同版本的PHP会有所不同,这里使用的 ...

  9. 【Leetcode_easy】1170. Compare Strings by Frequency of the Smallest Character

    problem 1170. Compare Strings by Frequency of the Smallest Character 参考 1. Leetcode_easy_1170. Compa ...

  10. Ubuntu 中改变文件的默认打开方式(转)

     源自:Ubuntu 中改变文件的默认打开方式 1. 相关配置文件 全局配置 /etc/gnome/defaults.list /usr/share/applications/mimeinfo.cac ...