vue项目移动端实现ip输入框问题
作者:肥皂泡 发布时间:2024-05-09 09:20:58
标签:vue,移动端,ip输入框
vue框架移动端做ip输入框组件,input在浏览器和微信端兼容问题。
要求:只能输入数字,输入数字以外的字符(包括点、冒号等数字符号)时自动跳到下一段ip输入框.
type=number类型,不会禁止点的输入。手动过滤拿不到包括点字符的字符串.而且输入多个点之后,拿到的值为空.
解决办法:type=tel,只能输入数字,且可以获取到点字符的输入
问题:微信下keyup事件无效,回调事件中event.keyCode返回全是229.
解决办法:监听input事件,event事件对象中keycode为空,但是event.data返回输入字符,可以实现过滤.
<template>
<div class="ipAdress">
<ul class="ipInput" :class="{isDisabled:isDisabled}" >
<li :key='index' v-for="(item,index) in ipAdress">
<input :tabindex="'ipInput'+(index+1)" :class="'ipAdress'+(index+1)" @blur="blurFocus(index)" autocomplete="off" :readonly="isDisabled" maxlength="3" type="tel" pattern="[0-9]{1,3}" @input="checkIpVal(item,index,$event)" :disabled="isDisabled" @keyup="turnIpPOS(item,index,$event)" @keydown="delteIP(item,index,$event)" v-model="item.value" ref="ipInput" />
<span v-if="index<3">.</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
ipAdress: [{
value: ''
}, {
value: ''
}, {
value: ''
}, {
value: ''
}],
isWX:navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == "micromessenger"
};
},
props: {
ipStr: {
trype: String,
default: ''
},
ipType: {
type: String
},
isDisabled: {
type: Boolean,
default: false
},
width: {
type: String,
default:'100%'
}
},
watch: {
ipStr:{
immediate:true,
handler:function(vall) {
let val = vall;
let nArr = [];
if(val && val.includes('.') && val.length > 0) {
let valArr = val.split('.');
let m = valArr.length;
for(let i = 0; i < 4; i++) {
if(valArr[i] == 'null' || valArr[i] == 'undefined'){
valArr[i] = '';
}
if(i < m) {
nArr.push({
value: valArr[i]
});
} else {
nArr.push({
value: ''
});
}
}
} else {
nArr = [{
value: ''
}, {
value: ''
}, {
value: ''
}, {
value: ''
}];
}
this.ipAdress = nArr;
}
}
},
methods: {
//methods
blurFocus(index) {
if(index == 3) {
this.$emit('blur');
}
},
checkIpVal(item,index,event) {
let self = this;
//wx
if(this.isWX){
let e = event || window.event;
let keyCode = e.data;
// //.向右跳转
if(keyCode === ".") {
e.preventDefault();
e.returnValue = false;
item.value = item.value.replace(/[^\d]/g, "").replace(/[\.]/g, "");
if(index < 3 ) {
self.$refs.ipInput[index + 1].focus();
}
return false;
}
}
let isNo = /^[0-9]{1,3}$/g;
if(/[^\d]/g.test(item.value)){
let cache = JSON.parse(JSON.stringify(self.ipAdress));
cache[index].value = item.value.replace(/[^\d]/g, "").replace(/[\.]/g, "");
self.ipAdress = cache;
return false;
}
if(item.value.replace(/[^\d]/g, "").length >= 3) {
let val = parseInt(item.value.replace(/[^\d]/g, ""), 10);
if(isNaN(val)) {
val = ''
} else if(val > 255) {
val = 255;
} else {
val = val < 0 ? 0 : val;
}
item.value = String(val);
this.$set(this.ipAdress,index,item);
if(index < 3 ) {
self.$refs.ipInput[index + 1].focus();
}
}
let ns = '';
this.ipAdress.forEach(item => ns += '.' + item.value);
if(ns.length <= 4){
this.$emit('getIP', "", this.ipType);
}else{
this.$emit('getIP', ns.slice(1), this.ipType);
}
},
turnIpPOS(item, index, event) {
let self = this;
let e = event || window.event;
if(e.keyCode == 37) {
if(index != 0) {
self.$refs.ipInput[index - 1].focus();
}
}
//右箭头、回车键、空格键、冒号均向右跳转,右一不做任何措施
if(e.keyCode == 39 || e.keyCode == 13 || e.keyCode == 32 || e.keyCode == 110 || e.keyCode == 46 || e.keyCode == 190 ) {
e.preventDefault();
e.returnValue = false;
if(index < 3 ) {
self.$refs.ipInput[index + 1].focus();
}
return false;
}
},
delteIP(item, index, event) {
let self = this;
let e = event || window.event;
let val = parseInt(item.value.replace(/[^\d]/g, ""), 10);
val = isNaN(val) ? '' : val;
if(e.keyCode == 8 && index > 0 && val.length==0) {
self.$refs.ipInput[index - 1].focus();
}
}
},
mounted(){
console.log(this.$props)
console.log(this.$attrs.index)
}
};
</script>
<style lang="scss" scoped>
$--border-color:#ccc;
$--outline-color:transparent;
$--font-color:$--input-color;
$base-font-size:12px;
.ipInput {
box-sizing: border-box;
line-height: inherit;
border: 1px solid $--border-color;
overflow: hidden;
border-radius: 5px;
padding: 0;
margin: 0;
display: inline-block;
vertical-align: middle;
outline: $--outline-color;
font-size:0;
text-indent: 0;
background: #fff;
&.isDisabled {
background: $--outline-color;
li{
cursor:not-allowed;
input{
cursor:not-allowed;
}
}
}
li {
display: inline-block;
width:25%;
box-sizing: border-box;
font-size:0;
input {
appearance: none;
padding:10px 5px;
width: calc(100% - 3px);
text-align: center;
outline: none;
border: none;
color: $--font-color;
box-sizing: border-box;
font-size: $base-font-size;
&:disabled {
background: $--outline-color;
}
}
span {
display: inline-block;
font-size:$base-font-size;
width: 3px;
color: $--font-color;
}
}
}
</style>
来源:https://segmentfault.com/a/1190000018559436


猜你喜欢
- 用SQLyog来分析MySQL数据库:SOLyog的下载、安装以及使用很简单。我去了相关网站下载,它只有384K字节大小。它把两个文件(一个
- Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!利用Python的多线程,只是利用CPU上下文切换的优势,
- 返回页面的类容,weburl为页面urlFunction GetBytes(weburl) '创建
- Python自定义函数在Python编程中,可以使用已经定义好的函数,也可以自定义函数实现某些特殊的功能。自定义函数的语法在Python中,
- 用js实现漂亮的雪花飘过效果:步骤:页面基本样式,雪花旋转动画效果body{ width: 100vw; height: 100vh; ba
- 这个错误是最新的错误哈,目前只在tensorflow上的github仓库上面有提出,所以你在百度上面找不到。是个tensorflow的bug
- 用python3.x实现base64加密和解密,供大家参考,具体内容如下加密base64_encrypt.py#!/usr/bin/pyth
- 网上看到一些例子,对于一个简单的3 级联动,都加上什么Struts, Hibernate诸如此类的框架。这个Ajax联动殊不知和这些框架有什
- ROW_NUMBER()说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。语法:ROW_NUMBER () OVER ( [
- 本文实例为大家分享了Bootstrap导航栏和登陆框的具体代码,供大家参考,有不足的地方请大家谅解,大家共同学习进步。<!DOCTYP
- 当一个函数进行完成后需要重定向到一个带参数的urlURLpath('peopleapply/<int:jobid>/
- 自从python2.2提供了yield关键字之后,python的生成器的很大一部分用途就是可以用来构建协同程序,能够将函数挂起返回中间值并能
- 1、如何认识可视化?需要指出的是,虽然不同绘图工具包的功能、效果会有差异,但在常用功能上相差并不是很大。与选择哪种绘图工具包相比,更重要的是
- 今天来说说编程语言中的动态类型语言与鸭子类型。动态语言 * 对动态语言的定义:动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数
- 直接使用==比较的情况分类说明是否能比较说明基本类型整型( int/uint/int8/uint8/int16/uint16/int32/u
- 使用PHP编写程序的时候,我们常常想要获取当前页面的URL。下面提供一个用于获取当前页面URL的函数以及使用方法:示例一:<?php/
- 一、Tornado简介Tornado是一个使用Python编写的高效、非阻塞的web服务器软件和网络库。它被设计用于处理数以千计的并发连接,
- 首先,adb实现对设备的reboot命令是:adb reboot . 但是如果是两台/多台设备的时候,需要声明serial number:
- 我们很少会一次性从数据库中取出所有的数据;通常都只针对一部分数据进行操作。 在Django API中,我们可以使用`` filter()``
- Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其