JavaScript 异步(一) 自动提示示列

大家都知道“自动提示”,看下面的一个示例代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Keyup Event</title>
</head>

<body>
<input type="text" id="autosuggestion" autocomplete="off" />
<div></div>
<script src="keyPress.js"></script>
<script>
	var testCase = keyPress({id: ‘autosuggestion‘});
</script>
</body>
</html>

看一下keyPress.js文件

(function(exprots){
	var cnt = 0,
		callBack = function(){
			cnt++;
			if(console)
				console.log(‘您触发了我‘ + cnt + ‘次‘);
		},
		keyPress = function(option){
			var elem = document.getElementById(option.id);
			addEvent(elem, ‘keyup‘, function(e){
				callBack();
			});
		},
	addEvent = (function(){
		return function(elm, evType, fn, useCapture){
			if (elm.addEventListener) {
				elm.addEventListener(evType, fn, useCapture);//DOM2.0
				return true;
			}else if (elm.attachEvent) {
				var r = elm.attachEvent(‘on‘ + evType, fn);//IE5+
				return r;
			}
			else {
				elm[‘on‘ + evType] = fn;//DOM 0
			}
		};
	})();
	exprots.keyPress = keyPress;
})(window);

效果如下:

但是问题来了,这段代码实现基本的需求是:每当我们输入一个字符的时候,就会触发“自动提示”,但这不是我们想要的预期结果。

我们预期的结果是:

1.当我们把一个关键字或关键句子输入完毕以后,我们才触发“自动提示”。

2.当我们连续删除输入框内容的时候,不触发“自动提示”,直到我们停止删除这个动作。

那么我们应该用什么样的方法达到我们预期的结果呢?首先我们先来分析一下代码逻辑:

1.每次当我们按下一个按键的时候,那么代码触发“自动提示”,这段代码是没有逻辑问题。

2.那么上面代码逻辑是正确的,但是它的缺点是输入和事件监听是同步的。

举个例子如下:

我们想输入完整的“我爱你”,然后再触发“自动提示”。

我们可以尝试用setTimeout函数延时,即当上一个输入完成后,可以让它延时执行。

这样就实现延时效果了,但是不足的是:按了多少次,还是要执行多少次,只不过每隔一段时间执行罢了。

然而这并不是我们期望的效果,我们想要是在最后输入“你”的时候执行“自动提示”。怎么办?可以采用下面的clearTimeout函数.

看一下keyPress.improve.js文件

(function(exprots){
	var cnt = 0,
		currentThread = null,
		delay = 300,
		callBack = function(){
			cnt++;
			if(console)
				console.log(‘您触发了我‘ + cnt + ‘次‘);
		},
		keyPress = function(option){
			var elem = document.getElementById(option.id);
			addEvent(elem, ‘keyup‘, function(e){
				clearTimeout(currentThread);//清除上一次操作
				currentThread = setTimeout(function(){
					callBack();
				}, delay);//进入排队状态
			});
		},
	addEvent = (function(){
		return function(elm, evType, fn, useCapture){
			if (elm.addEventListener) {
				elm.addEventListener(evType, fn, useCapture);//DOM2.0
				return true;
			}else if (elm.attachEvent) {
				var r = elm.attachEvent(‘on‘ + evType, fn);//IE5+
				return r;
			}
			else {
				elm[‘on‘ + evType] = fn;//DOM 0
			}
		};
	})();
	exprots.keyPress = keyPress;
})(window);

效果图:

期望的效果是达到了,但是我们是否可以让它更完美呢?

接下来我们思考下面几个问题,

  1. 我们是不是可以去掉有些不符合输入的键值呢?
  2. 我们是不是可以加入有些组合键值呢?

关于上面的问题,我们下次在讨论研究。

时间: 2025-01-04 08:51:46

JavaScript 异步(一) 自动提示示列的相关文章

转:在Eclipse下 支持编写html、css、javascript页面的自动提示

转:http://blog.csdn.net/qq247890212/article/details/7979951 我们平时用eclipse开发jsp页面时智能提示效果不太理想,其实eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclipse自带的插件,无需另外安装插件,具体步骤如下 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation

MyEclipse2015对Javascript自动提示的终极支持

2015通过集成Tern.js,进入了JS自动提示的最新时代 先看看具体效果吧:   点击链接会进入:   而tern.js已经支持相当多的框架:   关键这个提示不只是纯粹的js文件,对于jsp等等内置代码同样支持~~

JavaScript异步编程设计快速响应的网络应用

JavaScript已然成为了多媒体.多任务.多内核网络世界中的一种单线程语言.其利用事件模型处理异步触发任务的行为成就了JavaScript作为开发语言的利器.如何深入理解和掌握JavaScript异步编程变得尤为重要!!!<JavaScript异步编程设计快速响应的网络应用>提供了一些方法和灵感. 一.深入理解JavaScript事件 1. 事件的调度 JavaScript事件处理器在线程空闲之前不会运行(空闲时运行). var start = new Date(); setTimeout

简单的文本框输入自动提示

简单的文本框输入自动提示--输入的时候可以直接异步加载数据库中匹配的项,然后显示出来. 这里没有使用到数据库,直接在PHP用数组模拟数据存储.  demo演示 原理主要是: 监听输入框的状态,当有改变的时候即刻通过ajax发送数据并取得返回值. 主要使用了jQuery封装很方便,但貌似我这个兼容性不咋地...主要提供个思路吧~ js部分: <script type="text/javascript" src="./js/jquery.min.js">&l

Javascript 异步加载详解(转)

本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy execution),async 属性, defer 属性 一.同步加载与异步加载的形式 1. 同步加载 我们平时最常使用的就是这种同步加载形式: <script src="http://yourdomain.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续

AjaxPro局部刷新(输入时自动提示功能)

效果图 1.前台页面 <td class="queryLeft">股票名称:</td> <td class="queryRight"> <asp:TextBox ID="txtShareName" CssClass="shareName" onkeyup="prompt(this)" runat="server" autocomplete=&qu

实现搜索框自动提示功能(jquery+php)

客户端代码 <html> <head> <style> #search{font-size:14px;} #search .k{padding:2px 1px; width:320px;} #search_auto{border:1px solid #817FB2; position:absolute; display:none;} #search_auto li{background:#FFF; text-align:left;} #search_auto li.cl

javascript 文字大小自动适应文本框 (文字大小自动调整)

javascript 文字大小自动适应文本框 (文字大小自动调整) TOC 思考 思考一:面积法 思考二:微调法 代码 在进行类似微博墙之类的展示页面中,经常会遇到这样的需求:在固定大小的区域放入字数不定的文字,但是要求字体可以自动改变大小来自动填充这些区域.如下所示: 遇到这种情况怎么办呢? 思考 思考一:面积法 看到需求我的第一个反应是能不能通过计算,先获取整个区域的大小,然后再根据字数,计算出每个文字所占的区域(整体区域面积/总共字数),再根据每个文字所占的区域设置字体大小. 理论上这种方

JavaScript异步机制

单线程异步执行的JavaScript JavaScript是单线程异步执行的,单线程意味着代码在任务队列中会按照顺序一个接一个的执行.异步代表JavaScript代码在任务队列中的顺序并不完全等同于代码的书写顺序,比如事件绑定.Ajax.setTimeout()等任务的发生时间是“不可被预期”的. 既然JavaScript是单线程机制,那Ajax为什么是异步的?setTimeout()是怎样执行的? 在浏览器中,JavaScript引擎是单线程执行的.也就是说,在同一时间内,只能有一段代码被Ja