js自动提示功能,总是一卡一卡的

scy251147 2011-03-02 02:12:05
本想在系统中实现类似baidu或者是google的那种输入文字或者数字,然后会弹出自动下拉列表的功能,但是我做出来的东西,总是一卡一卡的。原因可能是我在文本框中加了事件 onpropertychange 调用列表函数导致的。
我现在的想法是,不在文本框中添加事件 onpropertychange ,而是 让系统自动检测 文本框是否是处于输入状态,如果处于输入状态,那么每隔100ms去检测一次数据,这样就可以避免卡了。
这个只是想法,望高手指教下,谢谢先。
ps:我已经查过诸多资料了 都没有得到
...全文
209 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaojing7 2011-03-05
  • 打赏
  • 举报
回复
我觉得这个功能没必要费劲心思去实现,网上有很多:
http://scriptlover.com/agent/?url=/controls/suggest/
http://scriptlover.com/agent/?url=/controls/suggest.rar.gz

当然如果为了练练手,还是可以的。以上是个参考。
Go 旅城通票 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fokker 的回复:]

可以使用onpropertychange事件,但是需要延时执行

在事件里面,你可以这样处理
//检查是否有延时的方法等待执行
if(window.hasWait){
window.clearTimeout(window.hasWait);
}
window.hasWait = window.setTimeout("......", 300);//这个时间,你自己多试验……
[/Quote]

你要使用延时执行操作,不是每次onpropertychange的时候都发送ajax,这样如果用户输入快的时候你可以clear掉上一次的延时操作。

要想速率更加快一点,可以使用缓存。将关键字作为键存入json对象中,这样再增加或者缩短关键字的时候判断是否有缓存,有就用缓存的,没有再发送ajax请求
my_nature_2 2011-03-04
  • 打赏
  • 举报
回复
以前不是都用keyup吗
kivetja 2011-03-04
  • 打赏
  • 举报
回复
我自己也做过多次这样的浮框, 一般keyup()就可以,onpropertychange也很好,onpropertychange有个不好的地方就是 无论什么时候改变了都触发。

这都不是重点啦,下面说真的:
1.浮动的div(也许你的不是div)最好等输入完或选中了选项再隐藏。
2.不要用 Xdiv.innerHTML = "<div>"+"新的HTML代码"+"</div>"。请学会用DOM插入。

Jquery很好用,可以用这个来做DOM操作。


附以前做的部份代码做。参考

function fly_show(){
$("#fly").empty();
for (var i = 0; i < Cu_A.length; i++) {
var cc = $("#_fly").clone();
cc.html(Cu_A[i][1]);
(function($){
var i_x=i;
cc.click(function(){
toT1(i_x);
});
})(jQuery);
cc.appendTo($("#fly"));
}
$("#fly div").hover(function(){$(this).addClass("mover");},function(){$(this).removeClass("mover")});
}
buqibushe 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 my_nature_2 的回复:]
以前不是都用keyup吗
[/Quote]

新学,我也是这么想的
kaifadi 2011-03-03
  • 打赏
  • 举报
回复
整台服务器资源是你自己独享的,速度很快的话,尝试下这种功能也未必不可!但是设置为100MS也太短了些!


如果你的后台是PHP,可以可以考虑使用内存缓冲,缓解数据库压力!其次就是数据库尽可能优化处理,能使用存储过程,最好不过了,其他后台我想也有对应的办法!
  • 打赏
  • 举报
回复
[Quote=引用楼主 scy251147 的回复:]
我现在的想法是,不在文本框中添加事件 onpropertychange ,而是 让系统自动检测 文本框是否是处于输入状态[/Quote]
前台没问题,不用想。
[Quote=引用 4 楼 scy251147 的回复:]
ajax函数是自己封装的,系统好多地方用,是没有问题的,关键就是去取数据的时候,需要填充四次datatable,然后再进行循环datatable放入到列表中,显示出来,这个地方耗时间了。
现在就是需要数据准备完,就推送到前台去,而不是卡在那儿,等待数据
[/Quote]
问题是你的后台查询和数据库设计上。

这种自动提示功能,应该从很方便很有效率取到数据的地方得到,怎样也不能是这样麻烦的即时过程。

如果这些数据不适合提前准备到一个专门的表或放到APPLICATION变量里,那这个自动提示是否应该加,就需要重新考虑了。不是凡是有点用的就要添加上去,要根据实际情况,使用合理有度。
rainsilence 2011-03-02
  • 打赏
  • 举报
回复
用定时器check你输入的值有没有改变。有改变才会再次查询
rainsilence 2011-03-02
  • 打赏
  • 举报
回复
另外,百度为了支持全浏览器,不是用句柄函数完成的事件触发。而是用定时器
rainsilence 2011-03-02
  • 打赏
  • 举报
回复
用分词hash,集群(结果放内存)。否则你每输入一次就去查一次。那百度的服务器还不瘫痪了。
fokker 2011-03-02
  • 打赏
  • 举报
回复
可以使用onpropertychange事件,但是需要延时执行

在事件里面,你可以这样处理
//检查是否有延时的方法等待执行
if(window.hasWait){
window.clearTimeout(window.hasWait);
}
window.hasWait = window.setTimeout("......", 300);//这个时间,你自己多试验来决定用多长
hch126163 2011-03-02
  • 打赏
  • 举报
回复
数据库端用存储过程,一个请求,直接返回你需要的所有数据!

优化存储过程的性能
scy251147 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 knightzhuwei 的回复:]
这个估计是你的列表函数的问题 你是怎么写这个ajax函数的啊?
[/Quote]
ajax函数是自己封装的,系统好多地方用,是没有问题的,关键就是去取数据的时候,需要填充四次datatable,然后再进行循环datatable放入到列表中,显示出来,这个地方耗时间了。
现在就是需要数据准备完,就推送到前台去,而不是卡在那儿,等待数据
scy251147 2011-03-02
  • 打赏
  • 举报
回复
后台处理比较复杂,估计耗时在这个上面了
knightzhuwei 2011-03-02
  • 打赏
  • 举报
回复
这个估计是你的列表函数的问题 你是怎么写这个ajax函数的啊?
knightzhuwei 2011-03-02
  • 打赏
  • 举报
回复
每隔100ms去检测一次数据
============
那还不如onpropertychange呢

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧