vue 自定义指令input表单的数据验证
一、代码
<template>
<div class="check" >
<h3>{{msg}}</h3>
<div class="input">
<input type="text" v-input v-focus><span>{{msg1}}</span>
</div>
<div class="input">
<input type="text" v-input v-required><span>{{msg2}}</span>
</div>
<div class="input">
<!-- required:true/false 表示这个是必填项 -->
<input type="text" v-input v-checked="{required:true,}"><span>{{msg3}}</span>
</div>
<div class="input">
<!-- <input type="text" v-input v-validate="'required|email|phone|min(5)|max(15)|minlength(6)|maxlength(12)|regex(/^[0-9]*$/)'">
required 验证是否是必填项
email 验证是否是邮箱
phone 验证是否是电话号码
min(5) 验证最小值
max(3) 验证最大值
minlength(6) 验证最小长度
maxlength(12) 验证最大长度
regex(/^[0-9]*$/) 进行正则验证
-->
<input type="text" v-input
v-validate="'required|min(5)|max(15)|minlength(6)|maxlength(12)|regex(/^[0-9]*$/)'" placeholder="多选验证">
</div>
<div class="input">
<!--
验证必须是数字:/^[0-9]*$/
验证由26个英文字母组成的字符串:/^[A-Za-z]+$/
验证手机号: /^[1][3,4,5,7,8][0-9]{9}$/;
验证邮箱:/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/;
-->
<input type="text" v-input v-validate="'required|phone'" placeholder="验证手机号码">
</div>
<div class="input">
<input type="text" v-input v-validate="'required|email'" placeholder="验证邮箱">
</div>
</div>
</template> <script>
export default {
name: 'check',
data() {
return {
msg: '指令',
tipsBorderColor: 'red',
msg1: '最简单的指令',
msg2: '验证不能为空的指令',
msg3: '进行正则验证',
tipsMsg: '',
}
}, directives: {
// 修饰input框的指令
input: {
// 当被绑定的元素插入到DOM上的时候
inserted: function (el) {
el.style.width = "300px";
el.style.height = "35px";
el.style.lineHeight = "35px";
el.style.background = "#ddd";
el.style.fontSize = "16px";
el.style.border = "1px solid #eee";
el.style.textIndent = "5px";
el.style.textIndent = "8px";
el.style.borderRadius = "5px";
}
},
// input框默认选中的指令
focus: {
inserted: function (el) {
el.focus();
}
},
// 不能为空的指令
required: {
inserted: function (el) {
el.addEventListener('blur', function () {
if (el.value == '' || el.value == null) {
el.style.border = "1px solid red";
console.log('我不能为空');
} })
}
},
// 验证指令
checked: {
inserted: function (el) {
return el
}
},
// 验证
validate: {
inserted: function (el, validateStr) {
// 将验证规则拆分为验证数组
let validateRuleArr = validateStr.value.split("|");
// 监听失去焦点的时候
el.addEventListener('blur', function () {
//失去焦点进行验证
checkedfun();
}); // 循环进行验证
function checkedfun() {
for (var i = 0; i < validateRuleArr.length; ++i) {
let requiredRegex = /^required$/; // 判断设置了required
let emailRegex = /^email$/; // 判断设置了email
let phoneRegex = /^phone$/; // 判断设置了 phone
let minRegex = /min\(/; //判断设置了min 最小值
let maxRegex = /max\(/; //判断设置了max 最大值
let minlengthRegex = /minlength\(/; //判断设置了 minlength 最大长度
let maxlengthRegex = /maxlength\(/; //判断设置了 maxlength 最大长度
let regexRegex = /regex\(/;
// 判断设置了required
if (requiredRegex.test(validateRuleArr[i])) {
if (!required()) {
break;
} else {
removeTips();
} } // 判断设置了email
if (emailRegex.test(validateRuleArr[i])) {
if (!email()) {
break;
} else {
removeTips();
} } // 判断设置了 phone
if (phoneRegex.test(validateRuleArr[i])) {
if (!phone()) {
break;
} else {
removeTips();
} } // 判断是否设置了最小值
if (minRegex.test(validateRuleArr[i])) {
if (!eval(validateRuleArr[i])) {
break;
} else {
removeTips();
} } // 判断是否设置了最大值
if (maxRegex.test(validateRuleArr[i])) {
if (!eval(validateRuleArr[i])) {
break;
} else {
removeTips();
} } // 判断设置了最小长度
if (minlengthRegex.test(validateRuleArr[i])) {
if (!eval(validateRuleArr[i])) {
break;
} else {
removeTips();
} } // 判断设置了最大长度
if (maxlengthRegex.test(validateRuleArr[i])) {
if (!eval(validateRuleArr[i])) {
break;
} else {
removeTips();
} } // 判断测试正则表达式
if (regexRegex.test(validateRuleArr[i])) {
if (!eval(validateRuleArr[i])) {
break;
} else {
removeTips();
} } } } // 验证是否是必填项
function required() {
if (el.value == '' || el.value == null) {
// console.log("不能为空");
tipMsg("不能为空");
return false;
} return true;
} // 验证是否是邮箱
function email() {
let emailRule = /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/;
if (!emailRule.test(el.value)) {
tipMsg("请输入正确的邮箱地址");
return false;
} return true;
} // 验证是否是手机号码
function phone() {
let phoneRule = /^[1][3,4,5,7,8][0-9]{9}$/;
if (!phoneRule.test(el.value)) {
tipMsg("请输入正确的手机号码");
return false;
} return true;
} // 最小值验证
function min(num) {
if (el.value < num) {
tipMsg("最小值不能小于" + num);
//console.log('最小值不能小于'+num);
return false;
} return true;
} // 最大值验证
function max(num) {
if (el.value > num) {
tipMsg("最大值不能大于" + num);
//console.log('最大值不能大于'+num);
return false;
} return true;
} // 最小长度验证
function minlength(length) {
if (el.value.length < length) {
//console.log('最小长度不能小于'+length);
tipMsg("最小长度不能小于" + length);
return false;
} return true;
} // 最大长度进行验证
function maxlength(length) {
if (el.value.length > length) {
//console.log('最大长度不能大于'+length);
tipMsg("最大长度不能大于" + length);
return false;
}
return true;
} // 进行正则表达式的验证
function regex(rules) {
if (!rules.test(el.value)) {
tipMsg("请输入正确的格式");
return false;
}
return true;
} // 添加提示信息
function tipMsg(msg) {
removeTips();
let tipsDiv = document.createElement('div');
let curDate = Date.parse(new Date());
tipsDiv.innerText = msg;
tipsDiv.className = "tipsDiv";
tipsDiv.id = curDate;
tipsDiv.style.position = "absolute";
tipsDiv.style.top = el.offsetTop + 45 + 'px';
tipsDiv.style.left = el.offsetLeft + 'px';
document.body.appendChild(tipsDiv);
//setTimeout(function(){
// document.getElementById(curDate).remove();
//},2000);
} // 移除提示信息
function removeTips() {
if (document.getElementsByClassName('tipsDiv')[0]) {
document.getElementsByClassName('tipsDiv')[0].remove();
} }
},
}
}
}
</script> <style> .input {
padding-bottom: 20px;
float: left;
clear: both;
margin-left: 500px;
display: block; } .check input {
width: 300px;
height: 35px;
outline: none;
background: #ddd;
} .check span {
padding-left: 20px;
} .tipsDiv {
height: 27px;
line-height: 25px;
border: 1px solid #333;
background: #333;
padding: 0px 5px;
border-radius: 4px;
color: #fff;
font-size: 16px;
} .tipsDiv:before {
content: '';
display: block;
border-width: 0 5px 8px;
border-style: solid;
border-color: transparent transparent #000;
position: absolute;
top: -9px;
left: 6px;
}
</style>
vue 自定义指令input表单的数据验证的更多相关文章
- 自定义常用input表单元素三:纯css实现自定义Switch开关按钮
自定义常用input表单元素的第三篇,自定义一个Switch开关,表面上看是和input没关系,其实这里采用的是checkbox的checked值的切换.同样,采用css伪类和"+" ...
- django做form表单的数据验证
我们之前写的代码都没有对前端input框输入的数据做验证,我们今天来看下,如果做form表单的数据的验证 在views文件做验证 首先用文字描述一下流程 1.在views文件中导入forms模块 2. ...
- vue自定义轻量级form表单校验
遇到了form表单提交的需求,找了vue的组件觉得不够灵活,有时间自己写了一个. 调用方法 全局引入注册: import va from 'global/js/va' va.install(Vue); ...
- 自定义常用input表单元素二:纯css实现自定义radio单选按钮
这是接着上一篇纯css自定义复选框checkbox的第二篇,自定义一个radio单选按钮,同样,采用css伪类和"+"css选择器为思路,下面是预览图: 下面直入主题放代码:HTM ...
- 自定义常用input表单元素一:纯css 实现自定义checkbox复选框
最下面那个是之前写的 今天在做项目的时候发现,之前写的貌似还是有点多,起码增加的span标签可以去掉,这样保持和原生相同的结构最好的,仅仅是样式上的变化.今天把项目中的这个给更新上来.下面就直接还是 ...
- Vue自定义指令 数据传递
在项目开发过程中,难免会遇到各种功能需要使用Vue自定义指令--directive 去实现 .关于directive的使用方式这里就不做过多的介绍了,Vue官方文档中说的还是听明白的.今天讲讲在使用V ...
- Vue基础-自定义事件的表单输入组件、自定义组件的 v-model
Vue 测试版本:Vue.js v2.5.13 学习 Vue 的自定义事件的表单输入组件,觉得文档讲的不太细致,所以这里再细化一下: 如果不用 v-model,代码应该是这样: <myinput ...
- css修改input表单默认样式重置与自定义大全
链接地址: 伪元素表单控件默认样式重置与自定义大全 http://www.zhangxinxu.com/wordpress/?p=3381 Chrome 现在不支持通过伪元素修改 meter 元素样式 ...
- vue 自定义指令(directive)实例
一.内置指令 1.v-bind:响应并更新DOM特性:例如:v-bind:href v-bind:class v-bind:title v-bind:bb 2.v-on:用于监听DOM事件: 例 ...
随机推荐
- axios全局拦截响应
在系统开发过程中,若遇到长时间未操作,则需要将页面跳转到登录页面.因为现在都是前后端分离的开发模式,路由跳转都交给前端,而后端只返回一个报错信息,例如"errorMsg":&quo ...
- jdk源码阅读
转载https://www.cnblogs.com/mh-study/p/10078548.html 1.java.lang 1) Object 12) String 13) AbstractStri ...
- HDU 3607 线段树+DP+离散化
题意:从左往右跳箱子,每个箱子有金币数量,只能从矮处向高处跳,求最大可获得金币数,数据规模1<=n<=1e5. 显然是一个dp的问题,不难得出dp[ i ] = max(dp[j] )+v ...
- ThreadPoolTaskExecutor的配置使用
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ft305977550/article/de ...
- Docker学习のDocker中部署静态页网站
前言:部署一个静态页网站,我们需要 常见映射80端口的交互式容器 安装Nginx(或其他服务器) 安装文本编辑器vim 创建静态页面 修改Ngnix的配置文件 运行Ngnix 验证网站的防高温 一.设 ...
- Flutter 集成到现有iOS工程
前沿 由于我司已经有自己的App,flutter属于技术引进的一部分,也不太可能重新启动一个项目,因此目前我们是将flutter模块形式注入我们的App之中.即:将flutter模块集成到现在有iOS ...
- ionic js 滑动框ion-slide-box 滑动框是一个包含多页容器的组件,每页滑动或拖动切换
ionic 滑动框 ion-slide-box 滑动框是一个包含多页容器的组件,每页滑动或拖动切换: 效果图如下: 用法 <ion-slide-box on-slide-changed=&quo ...
- PHP算法之两数相加
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- try install gitlab ce at docker ce
sudo docker run --detach \ --env GITLAB_OMNIBUS_CONFIG="external_url 'http://192.168.1.30:8087/ ...
- CSIC_716_20191115【内置函数、递归、模块、软件开发规范】
内置函数 map map映射:语法结构(函数对象,可迭代对象) 依次从可迭代对象中取值,然后给函数做运算,再依次返回运算的结果. ss = map(lambda x: x + x, [1, 2, 3] ...