• 实时监听表单输入框的方法和一些思考


              实时监听表单输入框的方法和一些思考

      前言

        已经快一个多月没有写博客了。出来找实习加回校答辩花费了很多时间,然后刚进公司就开始接收公司的一些项目,还是学习到了很多知识,这种充实生活让我感觉到很踏实。身边的很多同学都陆续出来找工作了,有工资高的也有工资低的,其中的原因应该是很多的方面的,但是我感觉前期是实力加运气,但是到了后面一定是靠实力说话的,因此未来我还有很长的路需要走。(我的实习工资也不算好吧。。)

      需求

        最近做的项目有一个修改密码的页面,第一个输入框输入符合正则的密码,第二个输入框重复输入密码,要求要实时获取,当二者值相同的时候出现正确标识。 

               假设我第一次输入密码为123456,符合正则就会出现正确图标。第二次我输入1,则会出现错误图标(图1),为了便于看出我确实是输入了1,我在控制台输出此时的输入框值(图2), 依次类推,直到我们输入值为123456时,第二个输入框出现正确图标。

        (图1)         (图3)      

                (图2)                                                                                    (图4)

      第一次尝试

        使用了onchange事件,效果并不好。一查手册才发现该事件仅适用于文本域(text field),textarea和select元素。当用于select元素时,onchange事件会在选择某个选项时发生,当用于文本域和textarea时,该事件会在元素失去焦点时才发生。(特别提示下,在使用HTML5的FileReader接口时,实现文件上传是要使用文件表单的onchanges事件)。再提下onchange触发必须满足的两个条件: 1.当前对象属性改变,并且是有键盘或鼠标事件激发的(脚本触发无效)2.当前对象失去焦点(onblur);

      第二次尝试

        思考了一会,感觉用键盘事件也是可以的,以前貌似做过类似的效果,于是就动手测试起来.首先使用keypress事件,结果差强人意。效果如下:

           (图5)                    (图6)

        第一次输入密码依然是123456,但是第二次输入密码,输入1,输出空字符,接着输入2,此时才输入1,以此类推,第二次密码已经为123456(图5),输出确却是12345(图6)。当再输入7时,才出现正确图标,明显此时二者密码不同。因此keypress事件不符合要求,keydown事件同理。(感兴趣可以亲测)

        然后我使用了keyup事件,发现结果完美同需求是一模一样的。效果如图1-4,我就不贴图了。个人感觉应该是keydown,keypress事件在键盘按下时触发,此时输入框还没有获取到值,就执行处理程序,导致获取的值都是上一个状态的值。(可以理解为我们看到的已经获取到值是最新的状态了),而keyup事件是在键盘释放时触发,此时已经读到了键盘的值,再触发的处理程序,所以可以做到实时监测。期间参考了一些资料这篇博文这篇博文

        这就给我们一个思考的契机,是否某个操作的过程分别触发的不同事件,它的触发时机却是有一点区别的。比如:鼠标单击操作的mousedown,click,mouseup触发时机都是什么时候,也可以动手试试,这里就不多阐述了。

      第三次尝试

         结合 HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化。

         oninput事件的介绍:W3Cschool,很重要的一点是oninput事件是在元素值发生变化时立即触发的。其兼容性如图:

            

        IE9以下不支持oninput事件,我们可以使用IE特有的onpropertychange事件替代。

        因为我是用JQ写的,所以提下JQ写的核心代码:

    1 //给第二个输入框绑定事件
    2 $reInp.bind('input propertychange',  function() {
    3      // 代码
    4 });

        值得参考的博文

      总结

        经过一波三折,总算是比较完美的解决了。在实习过程中,最深的感受就是自己实在是很菜,很多都不会,要学习的还有很多。要了解了解业务,多和后端交流,可以少干很多不必要的工作。在一些规范方面也比从前做的更好了,未来可期吧。

  • 相关阅读:
    python json模块(15)
    python random模块(14)
    python time模块(13)
    python sys模块(12)
    python zip函数(11)
    python递归函数(10)
    python 浅拷贝和深拷贝(9)
    python is 和 == 区别(8)
    python 可变数据类型和不可变数据类型(7)
    python局部变量和全局变量(6)
  • 原文地址:https://www.cnblogs.com/cleaverlove/p/6681634.html
Copyright © 2020-2023  润新知