JS进阶 | 解决JQ keyup事件延迟的问题
写在前面
在使用keyup事件时,存在一个问题,假如想要做出类似于表单验证的demo:表单输入账号 “xxx” 后 再去ajax异步去后台数据库匹配,但是keyup事件的原理是每次键盘事件弹起就会检测,也就是输入“x”的时候就会检测,所以输入“xxx”就会使用三次ajax,这样的用户体验是不好的。再举一个例子,再用百度的时候,打开www.baidu.com 输入任意一个字符,就会自动弹出关于该字符的搜索信息,我感觉这个用户体验不好,我在输入一个字符的时候,百度搜索框下面某个新闻我很感兴趣,但是页面已经跳转,我history(-1)时,发现新闻页已经刷新了。这样我就看不到我想要看的新闻了。所以在输入“xxx”完整的字符再触发keyup事件显得比较重要。
如何实现
这个问题就是keyup事件延迟的问题。如何实现,很简单,就是使用定时器setTimeout和event.timeStamp。假设定期器为1000ms,定时器负责1000ms后触发keyup事件,setTimeout的原理就是,把当前事件的执行结果放入事件循环中,待JS引擎空闲时再去处理执行结果。event.timeStamp是一个事件的时间戳,表示发生事件的时间和日期(从 epoch 开始的毫秒数)epoch 是一个事件参考点。在这里,它是客户机启动的时间。
在keyup事件中引用event.timeStamp,last = event.timeStamp
在定时器中进行判断 if(last==event.timeStamp) 为真 则执行ajax
原理就是,last代表最后一次keyup的时间戳,你停止输入1000ms内没有再次触发keyup事件,则执行ajax,用代码表示就是(last==event.timeStamp)为真,如果你1000ms又触发了keyup事件,则继续判断,如果你停止输入1000ms内没有再次触发keyup事件,则执行ajax。
用代码完成
js:
// <input type="text" id="input">
$(function(){
$("#input").focus();
$("#input").on("keyup",function(e){
$this = $(this);
last = e.timeStamp;
setTimeout(function(){
// console.log(e.timeStamp);
var $data_data = $this.val();
if(last-e.timeStamp===0){
$.ajax({
type:"get",
url:"ajaxkeyup.php",
data:{
$data:$data_data
},
success:function(data){
console.log("ajax发送并接收响应成功显示的ok");
console.log(data); },
onerror:function(){
console.log("not ok");
}
})
}
},1000)
})
})
php:
<?php
$data = '123';
$getData = $_GET['$data'];
if ($getData==$data) {
echo "后台检测匹配失败显示的ok";
}else{
echo "后台检测匹配失败显示的failed";
}
?>
模拟数据库的数据为“123”,完整输入“123”后 执行ajax
demo如下

有点不清晰,但是效果就是当输入"123"时 触发keyup事件,执行ajax,显示ajax发送并接收成功,后台服务器也返回成功
当输入“1234”时,ajax发送并接收成功,但是后台检测失败
总结
这个问题是面试商汤科技呗问的问题,上一个被问的问题是promise实现红绿灯,这个问题是keyup事件的延迟。都使用了异步的操作方式,蚂蚁金服面试的时候也问JS有哪些异步操作,看来异步操作是JS的核心之一。
定时器setTimeout与异步ajax同时执行,既有页面无刷新的魅力也有事件循环的感觉。爽。
JS进阶 | 解决JQ keyup事件延迟的问题的更多相关文章
- js进阶 12-4 jquery键盘事件如何使用
js进阶 12-4 jquery键盘事件如何使用 一.总结 一句话总结:键盘和鼠标都是外设输入设备,所以函数很像,所以使用就像鼠标事件click一样 1.jquery键盘事件有哪三个? 1(up和do ...
- js进阶---12-12、jquery事件委托怎么使用
js进阶---12-12.jquery事件委托怎么使用 一.总结 一句话总结:通过on方法(事件委托),给要绑定事件的元素的祖先绑定事件,从而达到效果. 1.事件委托是什么? 通过事件冒泡,让子元素绑 ...
- js进阶 12-14 jquery的事件触发函数是哪两个
js进阶 12-14 jquery的事件触发函数是哪两个 一.总结 一句话总结:trigger和triggerHandler 1.trigger传额外参数时候的注意事项是什么? 注意样例中是三个参数 ...
- js进阶解决浏览器缓存不能自动更新的问题(在ajax的url上带上一个参数,可以是日期,或者是随机数)(随机数Math.random)(取得日期的毫秒数:new Date().getTime();)
js进阶解决浏览器缓存不能自动更新的问题(在ajax的url上带上一个参数,可以是日期,或者是随机数)(随机数Math.random)(取得日期的毫秒数:new Date().getTime();) ...
- 前端-js进阶和JQ源码思维导图笔记
看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记
- js进阶---12-11、jquery如何给动态创建出来的元素绑定事件
js进阶---12-11.jquery如何给动态创建出来的元素绑定事件 一.总结 一句话总结:通过事件委托的方式,通过on方法 1.on方法在事件绑定的时候,data方式带额外参数时,字符串参数和其它 ...
- js进阶 12 jquery事件汇总
js进阶 12 jquery事件汇总 一.常用事件 页面载入事件 ready() 文档就绪事件(当 HTML 文档就绪可用时) 鼠标事件 click() 触发.或将函数绑定到指定元素的 click 事 ...
- 移动端click事件延迟300ms的原因以及解决办法
这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题 —— 当时的网站都是为大屏幕设备所设计的.于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点 ...
- 移动端click事件延迟300ms的原因以及解决办法[转载]
原文:http://www.bubuko.com/infodetail-822565.html 这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题 —— 当时的网站都是为 ...
随机推荐
- Redis设计与实现——独立功能的实现
发布和订阅 频道的订阅和退订 struct redisServer{ //键是被订阅者频道 ,键是一个链表,记录所有订阅这个频道的客户端 dict *publish_channels } 订阅实现: ...
- 使用 .NET Core 3.x 构建RESTful Api(第三部分)
关于HTTP HEAD 和 HTTP GET: 从执行性能来说,这两种其实并没有什么区别.最大的不同就是对于HTTP HEAD 来说,Api消费者请求接口数据时,如果是通过HTTP HEAD的方式去请 ...
- hadoop2.6虚拟机安装
Linux环境设置/*安装Hadoop集群时要确保以下几个方面1.本机与虚拟机之间是否可以通信(Ping).如果不行检查下面 1.1本机防火墙关闭(开启情况是本机可以ping虚拟机,虚拟机不能ping ...
- Java多线程_缓存对齐
1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...
- Javascript模块化编程(二):AMD规范 (转)
原文作者: 阮一峰 日期: 2012年10月30日 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? ...
- cenos 7 mysql
CentOS 7的yum源中貌似没有正常安装mysql时的mysql-sever文件,需要去官网上下载 # wget http://dev.mysql.com/get/mysql-community- ...
- 怎么给Ubuntu Server安装GUI桌面
sudo apt update sudo apt upgrade sudo add-apt-repository universe sudo add-apt-repository multiverse ...
- 小案例-WebSocket实现简易聊天室
前言 在详解 HTTP系列之一讲到HTTP/2.0 突破了传统的"请求-问答模式"这一局限,实现了服务器主动向客户端传送数据.而本章将通过一种在单个TCP连接上进行全双工通信的协议 ...
- Maven快速入门(四)Maven中的pom.xml文件详解
上一章,我们讲了Maven的坐标和仓库的概念,介绍了Maven是怎么通过坐标找到依赖的jar包的.同时也介绍了Maven的中央仓库.本地仓库.私服等概念及其作用.这些东西都是Maven最基本.最核心的 ...
- 新手oracle重启、监听
有一次遇到了记录下. #su到oracle用户下 [root@localhost ~]# su - oracle #重启数据库:[oracle@localhost ~]$ sqlplus /nolo ...