大家都知道“自动提示”,看下面的一个示例代码:
<!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);
效果图:
期望的效果是达到了,但是我们是否可以让它更完美呢?
接下来我们思考下面几个问题,
我们是不是可以去掉有些不符合输入的键值呢?
我们是不是可以加入有些组合键值呢?
关于上面的问题,我们下次在讨论研究。
本文出自 “shoppa” 博客,谢绝转载!
原文:http://shoppa.blog.51cto.com/9992328/1620382