实时监听input输入内容的N种方法

现在有一个需求,需要我们实时监听input输入框中的内容,从而带来更好的用户体验,而不是等我们全部输入完毕才告诉我们格式不对
首先我们创建一个input输入框
    <form name='loginForm'>
        <input type='text' name='user'/>
    </form>
接着获取这个文本框
var loginForm=document.forms['loginForm'],
    user=loginForm.elements['user'];
    //无需设置input的id属性,只设置name即可

方法一

change事件
user.onchange=function(){
    consolo.log(user.value);
}

没错,这个方法的确可以帮助我们解决监听input输入内容的需求,不过这个方法有一个致命的缺点,他不是实时监听,只有input失去焦点且文本框内容发生改变才会触发。
方法二

keydown事件
keypress事件
keyup事件
这是三个键盘事件,不过这三个事件还是有一些不同
1.当按一下任意键,会触发onkeydown事件,如果不松开,将一直触发。
2.当按一下字符键(比如abcd1234这些)会触发onkeypress事件,如果不松开,将一直触发这个事件。
3.当释放键盘上的键,才触发onkeyup事件。
4.按下一个键盘上的字符键,三种事件的触发顺序keydown -> keypress -> keyup
5.按下esc键,在firefox浏览器以及ie浏览器会触发keypress事件,在chrome浏览器和Opera浏览器不会触发keypress(js高级程序设计第三版P379页的说法并不精确)
        user.onkeypress=function(){
            console.log(user.value);
        };
        user.onkeydown=function(){
            console.log(user.value);
        };
        user.onkeyup=function(){
            console.log(user.value);
        }
实际检测时会发现,keydown事件以及keypress事件会存在延迟,每次获取的输入值,都是之前的,总是慢半拍,原因是keydown与keypress总是在新值发生改变之前触发。
最后发现只有keyup符合要求,不过keyup也不是完美的,缺点就是当你复制粘贴值进去的时候,或者浏览器自动记住的值输入进去的时候,keyup事件不会触发

方法三

input事件
        user.oninput=function(){
            console.log(user.value);
        }
input事件就可以完美解决这个问题,不过他也有小缺点,那就是兼容性问题,它不支持ie9以下的浏览器,不过还好,我们有一个ie专属的事件propertychange()
总结:在解决需求的时候,一定要记得验证兼容性,不然又被测试小姐姐要求修改bug
  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Linux内核中实时监听键盘事件,可以使用input子系统。输入子系统通常包括一个或多个设备驱动程序,用于读取与输入设备(如键盘、鼠标等)相关的底层数据并将其传递给输入子系统。输入子系统然后将这些数据转换为通用输入事件,并将其传递给用户空间。 在内核中实时监听键盘事件的一方法是使用input设备驱动程序。这些驱动程序会注册一个input设备,每当有一个输入事件发生时,它们就会生成一个input_event结构体,并将其放入一个输入队列中。可以使用poll或select系统调用来阻塞等待输入事件,或者使用一个专门的线程来监听输入队列并处理输入事件。 以下是一个简单的示例代码,演示如何在内核中实时监听键盘事件: ``` #include <linux/input.h> #include <stdio.h> #include <fcntl.h> int main() { int fd; struct input_event ev; fd = open("/dev/input/event0", O_RDONLY); if (fd < 0) { perror("Could not open input device"); return 1; } while (1) { read(fd, &ev, sizeof(struct input_event)); if (ev.type == EV_KEY) { printf("Key %d %s\n", ev.code, ev.value ? "pressed" : "released"); } } return 0; } ``` 该代码打开设备文件"/dev/input/event0"(键盘设备),并不断读取输入事件。每当读取到一个键盘事件时,它将打印出事件类型、键码和按键状态(按下或释放)。可以在内核模块中使用类似的代码来实现键盘事件的实时监听

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值