vue项目移动端实现ip输入框问题


Posted in Javascript onMarch 19, 2019

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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用JQuery模仿淘宝的图片放大镜显示效果
Sep 15 Javascript
javascript实现动态侧边栏代码
Feb 19 Javascript
js取模(求余数)隔行变色
May 15 Javascript
jQuery判断对象是否存在的方法
Feb 05 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
Mar 18 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
Bootstrap table两种分页示例
Dec 23 Javascript
Vue下的国际化处理方法
Dec 18 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
基于Web Audio API实现音频可视化效果
Jun 12 Javascript
浅谈JavaScript中this的指向更改
Jul 28 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
Oct 30 Javascript
详解使用React.memo()来优化函数组件的性能
Mar 19 #Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
Mar 19 #Javascript
express.js中间件说明详解
Mar 19 #Javascript
js array数组对象操作方法汇总
Mar 18 #Javascript
浅析JavaScript异步代码优化
Mar 18 #Javascript
js实现图片局部放大效果详解
Mar 18 #Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 #Javascript
You might like
针对初学PHP者的疑难问答(2)
2006/10/09 PHP
php中的登陆login
2007/01/18 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
Smarty模板配置实例简析
2019/07/20 PHP
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
python基础教程之字典操作详解
2014/03/25 Python
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
简单介绍Python中的RSS处理
2015/04/13 Python
给Python入门者的一些编程建议
2015/06/15 Python
Python中的id()函数指的什么
2017/10/17 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
python写入文件自动换行问题的方法
2019/07/05 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
优秀员工推荐信
2014/05/10 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
2015年销售部工作总结范文
2015/04/27 职场文书
男生贾里读书笔记
2015/06/30 职场文书
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python