当前位置: 首页 > news >正文

vue自定义全局指令v-emoji限制input输入表情和特殊字符

问题:

  1. 后台不提供富文本存储,所以emoji表情入库会报错
  2. 需求要求前端在输入的时候过滤掉表情符号
  3. 全局的input 和富文本textarea输入框都需要过滤emoji表情

分析:

1.每一个input写事件写正则校验代码量实在太多了还很麻烦;所以想用自定义全局指令,就不需要每个用到的地方都去引入了。
2.emoji太多了,并且输入法的emoji、mac自带的emoji 、windows自带的emoji是不一致的。全部emoji列出来一一过滤替换实在不现实,后来发现emoji表情都是2个字符的长度,其他键盘输入都是一个字符的长度。因此用字符长度来校验可行
3.需要在输入的时候过滤掉表情符号,那么就需要在(keyup)键盘触发的时候监听触发过滤事件

js实现输入框监听方法 common/utils/emoji'

const findEle = (parent, type) => { return parent.tagName.toLowerCase() === type ? parent : parent.querySelector(type)
}
const trigger = (el, type) => {  // 给元素绑定事件const e = document.createEvent('HTMLEvents')e.initEvent(type, true, true)el.dispatchEvent(e)
}const emoji = {// el:指令所绑定的元素,可以用来直接操作 DOM。// vnode:Vue 编译生成的虚拟节点bind: function (el, binding, vnode) { // 指令第一次绑定到元素时调用// 判断是否是emoji图标const isEmoji = char => {// 表情都是2个字符return char.length > 1;}const emoji2empty = str => {  // emoji图标都替换成空字符串‘’return Array.from(str).filter(c => !isEmoji(c)).join('')}let $inp = findEle(el, 'input') || findEle(el, 'textarea')  // 判断绑定元素是否是input输入框或者富文本输入框el.$inp = $inp $inp.handle = function () {let val = $inp.value$inp.value = emoji2empty(val)  // 监听输入框的emoji图标转换成空trigger($inp, 'input')}$inp.addEventListener('keyup', $inp.handle)  // el添加键盘监听事件keyup$inp.addEventListener('blur', $inp.handle) // el添加键盘失焦事件blur},unbind: function (el) {  // 只调用一次,指令与元素解绑时调用。el.$inp.removeEventListener('keyup', el.$inp.handle) el.$inp.removeEventListener('blur', el.$inp.handle)},
}
export default emoji

入口文件引入emoji并且全局注入指令
Vue.directive( id, [definition] )
id: 为指令唯一id
{Function | Object} [definition] 注册的指令
一个指令定义对象可以几个钩子函数 (均为可选):这里使用到bind和unbind
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
unbind:只调用一次,指令与元素解绑时调用。

基础用法

<el-inputv-emojiv-bind="control"v-model="value"maxlength="99"
>
import emoji from '@/utils/emoji'
http://www.lryc.cn/news/205475.html

相关文章:

  • Excel 5s内导入20w条简单数据(ExecutorType.BATCH)Mybatis批处理的应用
  • 【期刊】IEEE系列指定期刊模版下载(LaTeX或者Word)全网最细教程
  • 损失函数和评估函数
  • 第四章 文件管理 四、文件的物理结构(文件分配方式)
  • 解析外贸开发信的结构?营销邮件书写技巧?
  • Linux的命令基本格式
  • 数据库Redis(二):基本数据类型
  • mysql第四次作业
  • kubesphere 一键部署K8Sv1.21.5版本
  • 设计模式(12)状态模式
  • C#WPFPrism框架模块化应用实例
  • ES6之Set集合(通俗易懂,含实践)
  • 深度学习标注工具(包括自动标注)总结——持续更新
  • 阿里云核心产品list
  • 矢量图形编辑软件 illustrator 2023 mac 中文软件特点
  • vue按特定字符串切割后端传输的图片路径
  • Spring底层原理(三)
  • ElementPlus表格中的背景透明
  • 【会议征稿通知】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)
  • PyCharm改变代码背景图片的使用教程
  • BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain
  • Kubernetes速成课程:掌握容器编排的精髓
  • 【数据库】分组数据 GROUP BY、HAVING
  • “唯品会VIP商品API:一键获取奢侈品详情,尊享品质生活!“
  • uniapp解决iOS切换语言——原生导航栏buttons文字不生效
  • idea 基础设置
  • Rockchip Uboot CmdLine 作用 来源 常用参数
  • MySQL表导出
  • HTML页面获取URL传递的参数值
  • mac安装jenkins