需求如下:
(1)输入.时,自动跳入下一输入框;
(2)按下backspace删除键,自动回退到上一输入框
(3)支持任意位置复制、粘贴ip
效果如下:
代码如下:
父组件:
<template>
<div class="wrapperBox">
<ip-input class="m-r10" v-model="ip_ariginal"></ip-input>
<el-button @click="handleSearch" class="fillUpBtn-blue">搜索</el-button>
</div>
</template>
<script>
import IpInput from "@/components/ip-input";
export default {
components: { IpInput },
data() {
return {
ip_ariginal:""
}
},
mounted() {},
methods: {
//根据关键字搜索
handleSearch() {
let ip_ariginal = this.ip_ariginal;
if(ip_ariginal!==""){
let ipList = ip_ariginal.split('.');
for (let index = 0; index < ipList.length; index++) {
if(ipList[index]==null || ipList[index]===""){
this.$message.error("请输入完整的IP地址!");
return false;
}
}
}
//宝子们,后面的逻辑代码可根据自己的需求进行自定义补充哈
}
}
}
</script>
<style lang='less'></style>
子组件:
<template>
<div>
<div class="f-r a-c ipBox">
<el-input
v-model.number="ip1"
maxlength='3' ref='ip1'
class="ipInput"
@paste.native="handlePaste(1,$event)"
@keyup.native="keyupEvent(1,$event)"
@blur="submitIp"
@input="(val) => handleInpIp(val,'ip1')"></el-input>
<span class="dot">.</span>
<el-input
v-model.number="ip2"
maxlength='3' ref='ip2'
class="ipInput"
@paste.native="handlePaste(2,$event)"
@keyup.native="keyupEvent(2,$event)"
@blur="submitIp"
@input="(val) => handleInpIp(val,'ip2')"></el-input>
<span class="dot">.</span>
<el-input
v-model.number="ip3"
maxlength='3' ref='ip3'
class="ipInput"
@paste.native="handlePaste(3,$event)"
@keyup.native="keyupEvent(3,$event)"
@blur="submitIp"
@input="(val) => handleInpIp(val,'ip3')"></el-input>
<span class="dot">.</span>
<el-input
v-model.number="ip4"
maxlength='3' ref='ip4'
class="ipInput"
@paste.native="handlePaste(4,$event)"
@keyup.native="keyupEvent(4,$event)"
@blur="submitIp"
@input="(val) => handleInpIp(val,'ip4')"></el-input>
<i v-if="isShowDeleteBtn" class="closeBtn el-icon-circle-close m-r5" @click="clearValue"></i>
</div>
</div>
</template>
<script>
export default {
name: "IpModel",
model:{
prop:"value",
event:"change",
},
props:{
value:String
},
data() {
return {
ip1: null,
ip2: null,
ip3: null,
ip4: null,
isShowDeleteBtn:false
};
},
methods: {
//利用复制粘贴的方式输入ip地址
handlePaste(index, event) {
const e = event || window.event
let ipValue = e.clipboardData.getData('Text');
if(ipValue!=null && ipValue!=undefined && ipValue!==""){
let reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
//IP地址格式不正确
if(!reg.test(ipValue)){
this.$message.error("请输入正确的IP地址dsfdsf!");
setTimeout(() => {
this.ip1 = null;
this.ip2 = null;
this.ip3 = null;
this.ip4 = null;
}, 600)
if (index == 1) {
setTimeout(() => {
this.$refs.ip1.focus();
}, 100)
}
if (index == 2) {
setTimeout(() => {
this.$refs.ip2.focus();
}, 100)
}
if (index == 3) {
setTimeout(() => {
this.$refs.ip3.focus();
}, 100)
}
if (index == 4) {
setTimeout(() => {
this.$refs.ip4.focus();
}, 100)
}
}
else{
let ipList = ipValue.split('.');
setTimeout(() => {
this.ip1 = ipList[0];
this.ip2 = ipList[1];
this.ip3 = ipList[2];
this.ip4 = ipList[3];
this.$refs.ip4.focus();
this.isShowDeleteBtn = true;
}, 5)
}
}
},
//监听键盘(按下.键跳到下一个输入框,同理可做出其他按键的跳转输入框)
keyupEvent (index,e) {
//不同键盘键位对应 . 的值 87键->190 104键->110
if (e.keyCode === 110 || e.keyCode === 190) {
if (index == 1) {
this.$nextTick(() => {
this.$refs.ip2.focus();
});
}
else if (index == 2) {
this.$nextTick(() => {
this.$refs.ip3.focus();
});
}
else {
this.$nextTick(() => {
this.$refs.ip4.focus();
});
}
this["ip"+index] = "";
}
//按下backspace删除键
if (e.keyCode == 8) {
let ipVal = this["ip"+index];
if(ipVal==="" || ipVal==null && index!==1){
let indexValue = index-1;
this.$refs['ip'+indexValue].focus();
}
}
},
//输入框输入时
handleInpIp(val, key) {
//是否隐藏清除按钮
if((this.ip1 !== null&&this.ip1 !== "") || (this.ip2 !== null&&this.ip2 !== "") || (this.ip3 !== null&&this.ip3!=="") || (this.ip4 != null&&this.ip4!=="")){
this.isShowDeleteBtn = true;
}
else{
this.isShowDeleteBtn = false;
}
//判断输入的ip值,如果输入值超过255,则显示为255,并且跳到下一个输入框
if(parseInt(val) > 255) {
switch(key) {
case "ip1":
this.ip1 = 255;
this.$refs.ip2.focus();
break;
case "ip2":
this.ip2 = 255;
this.$refs.ip3.focus();
break;
case "ip3":
this.ip3 = 255;
this.$refs.ip4.focus();
break;
case "ip4":
this.ip4 = 255;
break;
default:
break;
}
}
//如果输入的是三位数,且范围在100到255之间,则自动跳到下一个输入值
else if(parseInt(val) <= 255 && parseInt(val) >= 100){
switch(key) {
case "ip1":
this.$refs.ip2.focus();
break;
case "ip2":
this.$refs.ip3.focus();
break;
case "ip3":
this.$refs.ip4.focus();
break;
default:
break;
}
}
},
//输入框失去焦点时
submitIp() {
if((this.ip1==null || this.ip1==="") && (this.ip2==null || this.ip2==="") && (this.ip3==null || this.ip3==="") && (this.ip4==null || this.ip4==="")){
let ipVal = "";
this.$emit('change', ipVal);
}
else{
let reg = /[^\d]/g;
let ipVal = "";
let regIp1 = false;
let regIp2 = false;
let regIp3 = false;
let regIp4 = false;
if(this.ip1 !=null && this.ip1 !==""){
regIp1 = reg.test(this.ip1);
}
if(this.ip2 !=null && this.ip2 !==""){
regIp2 = reg.test(this.ip2);
}
if(this.ip3 !=null && this.ip3 !==""){
regIp3 = reg.test(this.ip3);
}
if(this.ip4 !=null && this.ip4 !==""){
regIp4 = reg.test(this.ip4);
}
//验证ip1、ip2、ip3、ip4的输入格式,只要有一个输入不正确,就提示报错信息
if(regIp1 || regIp2 || regIp3 || regIp4){
this.$message.error("请输入正确的IP地址uuu!");
this.ip1 = null;
this.ip2 = null;
this.ip3 = null;
this.ip4 = null;
this.isShowDeleteBtn = false; //隐藏清除按钮
ipVal = "";
}
else{
let ip1 = this.ip1==null?"":this.ip1;
let ip2 = this.ip2==null?"":this.ip2;
let ip3 = this.ip3==null?"":this.ip3;
let ip4 = this.ip4==null?"":this.ip4;
ipVal = ip1 + '.' + ip2 + '.' + ip3 + '.' + ip4;
}
this.$emit('change', ipVal);
}
},
//清除ip
clearValue () {
//重置ip输入框
this.ip1 = null;
this.ip2 = null;
this.ip3 = null;
this.ip4 = null;
this.isShowDeleteBtn = false; //隐藏清除按钮
let ipVal = "";
this.$emit('change', ipVal);
},
},
watch:{
value(val) {
let ipVal = "";
if(val !== null && val !== undefined && val !==""){
let ipList = val.split('.');
this.ip1 = ipList[0];
this.ip2 = ipList[1];
this.ip3 = ipList[2];
this.ip4 = ipList[3];
ipVal = this.ip1+'.'+this.ip2+'.'+this.ip3+'.'+this.ip4
}
else{
ipVal =="";
}
//this.$emit("change",ipVal)
},
}
}
</script>
<style scoped lang='less'>
.dot {
width: 4px;
}
.ipBox{
width: 291px;
border: 1px solid #ccc;
border-radius: 5px;
}
.ipInput{
width: 65px;
/deep/ .el-input__inner {
border: 0;
text-align: center;
}
font-size: 14px;
}
.closeBtn{
color: #C0C4CC;
font-size: 14px;
transition: transform .3s;
transform: rotateZ(180deg);
cursor: pointer;
}
</style>
如有漏洞,欢迎互动指教!!!!!!!!!!!!!