HTML中将ip地址写成输入,点的形式,将mac地址写成输入,冒号的形式,并进行前后端的数据交互,以及实现一些快捷的操作及输入的限制。

首先说明一下,最近项目中有个需求是将ip和mac写成如下图的形式:

ip、mac样式

我在网上查了一下,大概意思是这样的:

思路

然后,我就开始写代码样式了,先模仿出需要的样式后,就是向后台传值的问题了,原来一个input不管是在显示和传值上都很方便,但是换成ip四个输入框,mac六个输入框之后就很麻烦了,然后我就在每一个div前面写了一个隐藏的文本框,用于将页面上显示的ip和Mac获取到之后放到隐藏的文本框中传递到后台去。就这样功能算是写好了,但是。。。。。。。。操作上还是有很多的不便,所以我在操作上也做了一些优化,主要有以下几点:

1.按键盘上,下,左,右键输入框可以左右切换
2.ip里面只能输入数字,如果输入非数字,会把非数字那个字段删除掉
3.ip的第一个小格数字要介于1-233之间,其他三格介于0-255之间,如果输入不在这个范围,就清空当前小格
4.ip只有在当前小格有输入,且输入为数字的时候按键盘点(.)会跳到下一格,要是当前格是空的,按点(.)不会有任何反应----mac同理,只是按冒号(:)而已
5.当ip输入3个,mac输入两个的时候会自动跳到下一个小格
6.当点击键盘Backspace删除时,如果当前框删除完了,会自动跳到前一个框进行删除
7.mac里面只能输入字母和数字,其他功能与ip类似

关于后台取值以及ip和mac回显,我后面做了一个函数的封装,其中隐藏文本里每一个ip或mac地址对应一个隐藏的文本框,将拼接好的ip或mac放到隐藏文本框中传给后台:HTML中将ip地址写成输入,点的形式,将mac地址写成输入,冒号的形式,并进行前后端的数据交互,以及实现一些快捷的操作及输入的限制。(代码封装)_笑到世界都狼狈的博客-CSDN博客

最后上代码:

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        #macValDe{width:233px;height: 30px;line-height:24px;border: 1px solid #ccc;border-radius: 5px;display:inline-block;}
        #macValDe>input{height: 21px;width:26.3px; border: none; outline: none; padding-left: 5px;position: relative;top: 2px;text-align: center; }
        #ipValDe{width: 179px;height: 30px;line-height:22px;border: 1px solid #ccc;border-radius: 5px;display:inline-block;margin-top: 20px;}
        #ipValDe>input{height: 21px; width:32.3px; border: none; outline: none; padding-left: 5px;position: relative;top: 2px;text-align: center; }

    </style>
    <script type="text/javascript" src="lib/jquery.js"></script>
</head>
<body>
    <div>
        <!-- id="mac"用户将页面上显示的mac值传给后台 -->
        <input type="hidden" name="mac" id="mac" class="required mac" value="">
        <!-- 将Mac输入框修改成带冒号的格式 -->
        mac地址:<div id="macValDe">
            <input type="text" value="" class="mac1" maxlength="2">:<input type="text" value="" class="mac2" maxlength="2">:<input type="text" value="" class="mac3" maxlength="2">:<input type="text" value="" class="mac4" maxlength="2">:<input type="text" value="" class="mac5" maxlength="2">:<input type="text" value="" class="mac6" maxlength="2">
        </div>
    </div>


    <div>
        <!-- id="ip"用户将页面上显示的ip值传给后台 -->
        <input type="hidden" name="ip" id="ip" class="ip" value="">
        <!-- 将ip输入框修改成带点的格式 -->
        ip地址:<div id="ipValDe">
            <input type="text" value=""  class="ip1" maxlength="3">.<input type="text" value="" class="ip2" maxlength="3">.<input type="text" value="" class="ip3" maxlength="3">.<input type="text" value="" class="ip4" maxlength="3">
        </div>
    </div>

    <script type="text/javascript">
        /**
         * 当ip和Mac有初始值时,将其拆开,显示在每一个文本框中
         * */
        // Mac
        var macShow="b0:6e:bf:2e:98:4c";
        var resultMac=macShow.split(":");
        $("#macValDe>.mac1").val(resultMac[0]);
        $("#macValDe>.mac2").val(resultMac[1]);
        $("#macValDe>.mac3").val(resultMac[2]);
        $("#macValDe>.mac4").val(resultMac[3]);
        $("#macValDe>.mac5").val(resultMac[4]);
        $("#macValDe>.mac6").val(resultMac[5]);
        // ip
        var ipShow="192.168.10.5";
        var resultIp=ipShow.split(".");
        $("#ipValDe>.ip1").val(resultIp[0]);
        $("#ipValDe>.ip2").val(resultIp[1]);
        $("#ipValDe>.ip3").val(resultIp[2]);
        $("#ipValDe>.ip4").val(resultIp[3]);
        /**
         * mac发生变化时调用即可
         * 将每一个小格中的值获取到传给后台
         * 如果小格中没有值则传空值,有值则传value值,并在后面加上:封号,最后一个不用加
         * */
        function macc(){
            var mac1,mac2,mac3,mac4,mac5,mac6;
            if ($("#macValDe>.mac1").val() == ''){
                mac1 = '';
            } else {
                mac1 = $("#macValDe>.mac1").val() + ':';
            }
            if ($("#macValDe>.mac2").val() == ''){
                mac2 = '';
            } else {
                mac2 = $("#macValDe>.mac2").val() + ':';
            }
            if ($("#macValDe>.mac3").val() == ''){
                mac3 = '';
            } else{
                mac3 = $("#macValDe>.mac3").val() + ':';
            }

            if ($("#macValDe>.mac4").val() == ''){
                mac4 = '';
            } else {
                mac4 = $("#macValDe>.mac4").val() + ':';
            }
            if ($("#macValDe>.mac5").val() == ''){
                mac5 = '';
            } else {
                mac5 = $("#macValDe>.mac5").val() + ':';
            }
            if ($("#macValDe>.mac6").val() == ''){
                mac6 = '';
            } else{
                mac6 = $("#macValDe>.mac6").val();
            }
            var macc = mac1+ mac2 + mac3 + mac4 + mac5 + mac6;
            $("#mac").val(macc);
        }
        /**
         * ip发生变化时调用即可
         * 同Mac一样
         * */
        function ipp(){
            var ip1,ip2,ip3,ip4;
            if ($("#ipValDe>.ip1").val() == ''){
                ip1 = '';
            } else {
                ip1 = $("#ipValDe>.ip1").val() + '.';
            }
            if ($("#ipValDe>.ip2").val() == ''){
                ip2 = '';
            } else {
                ip2 = $("#ipValDe>.ip2").val() + '.';
            }
            if ($("#ipValDe>.ip3").val() == ''){
                ip3 = '';
            } else {
                ip3 = $("#ipValDe>.ip3").val() + '.';
            }
            if ($("#ipValDe>.ip4").val() == ''){
                ip4 = '';
            } else {
                ip4 = $("#ipValDe>.ip4").val();
            }
            var ipp = ip1 + ip2 + ip3 + ip4;
            $("#ip").val(ipp);
        }
        /**
         * mac地址格式
         * 键盘按方向键上下左右,光标在四个input中来回切换
         */
        $('#macValDe>input').each(function(i,o){
            $(this).attr('cust_index', i);
        })

        $('#macValDe>input').keydown(function(event){
            var keycode = event.which;
            //从最后一个小格开始删除,删完之后直接跳到前一个小格中继续删除
            if (event.keyCode == 8 && $(this).val().length == 0){
                $(this).prev().focus();
            }
            if(38 != keycode && 40 != keycode && 37 != keycode && 39 != keycode){
                return;
            }
            var ti =  $(this).attr('cust_index');
            if(39 == keycode || 40 == keycode) {
                //down
                ti++;
            }else{
                //up
                ti--;
            }
            if(ti < 0){
                ti = 0;
            }
            var next_obj = $('#macValDe>input[cust_index='+ti+']');
            if(next_obj){
                next_obj.focus();
            }
        })

        /**
         * 限制mac输入,以及跳下一格的条件
         * */
        $('#macValDe>input').bind('input propertychange',function () {
            //限制mac只能输入数字母
            var c=$(this);   
            //截取输入的最后一个字符
            var lastStr=c.val().substr(c.val().trim().length-1,1);
             if(/[^\w]/.test(c.val())) {
                //替换非字母和数字字符,当输入不是字母或数字的时候用空替换
                var temp_amount = c.val().replace(/[^\w]/g, '');
                $(this).val(temp_amount);
                    // 当前小格输入的最后一个字符是.并且长度不等于空
                if(/[:]/.test(lastStr) && $(this).val() != ''){
           $(this).next().focus();
        }
     }    
            //当前小格输入长度为2时自动跳到下一格
            if ($(this).val().trim().length == 2){
                $(this).next().focus();
            }
        })
        /**
         * 限制ip输入,以及跳下一格的条件
         * */
        $('#ipValDe>input').bind('input propertychange',function () {
            // 输入不是数字的时候清空
            var c=$(this);
          //截取输入的最后一个字符
          var lastStr=c.val().substr(c.val().trim().length-1,1);
         if(/[^\d]/.test(c.val())) {
                //替换非数字字符
                var temp_amount = c.val().replace(/[^\d]/g, '');
                $(this).val(temp_amount);
         // 当前小格输入的最后一个字符是.并且长度不等于空
        if(/[.]/.test(lastStr) && $(this).val() != ''){
           $(this).next().focus();
         }
         }
            // 第二,三,四位输入不在0-255之间的时候清空
            if ($(this).val() < 0 || $(this).val() > 255){
                $(this).val('');
            }
            //第一位输入不在1-223之间的时候清空
            if ($("#ipValDe>.ip1").val() < 1 || $("#ipValDe>.ip1").val() >223){
                $("#ipValDe>.ip1").val('');
            }
            //当每一小格输入的长度等于3时,自动跳到下一个
            if ($(this).val().trim().length == 3){
                $(this).next().focus();
            }
        })

        /**
         * ip地址格式
         * 键盘按方向键上下左右,光标在四个input中来回切换
         */
        $('#ipValDe>input').each(function(i,o){
            $(this).attr('cust_index', i);
        })
        $('#ipValDe>input').keydown(function(event){
            var keycode = event.which;
            //从最后一个小格开始删除,删完之后直接跳到前一个小格中继续删除
            if (event.keyCode == 8 && $(this).val().length == 0){
                $(this).prev().focus();
            }
            if(38 != keycode && 40 != keycode && 37 != keycode && 39 != keycode){
                return;
            }
            var ti =  $(this).attr('cust_index');
            if(39 == keycode || 40 == keycode) {
                //down
                ti++;
            }else{
                //up
                ti--;
            }
            if(ti < 0){
                ti = 0;
            }
            var next_obj = $('#ipValDe>input[cust_index='+ti+']');
            if(next_obj){
                next_obj.focus();
            }
        })
    </script>
    
</body>
</html>

这段代码写了时隔好几年后,竟然被测试测出来bug,原因是这样的当输入法是中文时,在MAC地址栏输入,会连切两小格子。

对此在切换到下一小格时做了一点限制,具体代码如下:

 /**
     * 限制mac输入,以及跳下一格的条件
     * 存在bug,输入中文的时候会连跳好几个,通过判断compositionstart、compositionend、keyCode进行了限制
     * */
    var isChinese = 0
    $('.macVal>input').bind('input propertychange',function () {
        //限制mac只能输入数字母
        var c=$(this);
        //截取输入的最后一个字符
        var lastStr=c.val().substr(c.val().trim().length-1,1);
        if(/[^\w]/.test(c.val())) {
            //替换非数字字符
            var temp_amount = c.val().replace(/[^\w]/g, '');
            $(this).val(temp_amount);
            // 当前小格输入的最后一个字符是.并且长度不等于空
            if(/[:]/.test(lastStr) && $(this).val() != ''){
                $(this).next().focus();
            }
        }
        //当前小格输入长度为2且输入法不是中文时跳到下一格
        // console.log('isChinese111', isChinese)
        if (($(this).val().trim().length == 2) && isChinese == 0){
            $(this).next().focus();
        }
    }).on('compositionstart', function (e) {
        isChinese = 1;
        // console.log('中文输入:开始', isChinese);
    }).on('compositionend', function (e) {
        isChinese = 0
        // console.log('中文输入:结束', isChinese);
    }).keydown(function(event){
        // console.log('event.keyCode', event.keyCode)
        if(event.keyCode==32 || event.keyCode==16 || event.keyCode==17){
            isChinese = 0
            // console.log('键盘', isChinese)
        }
    });

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值