ajaxtags是java环境下的ajax框架,其实也谈不上一个框架,算是代码的集成方案吧。在最近的一个项目里在实现自动完成功能的输入框,使用了 ajaxtags 提供的autocomplete。
总体感觉ajaxtags的autocomplete完成了我想要的大部分功能。但是用户希望框入如果不输入内容的话应该可以进行直接的选择,有点像是输入选择框。当鼠标双击输入框后,如果输入框中没有值,显示所有可选项。
所以动手改起了autocomplete的源代码,现在讲讲思路:
在使用autocomplete的网页中引入了ajaxtags.js和scriptaculous.js。发现ajaxtags.js依赖controls.js,也就是说ajaxtags.js的autocomplete实际上是在javascript里扩展了controls里的autocomplete。
那就从根子上解决问题吧,打开controls.js,找到87行
Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
复制以后,插入新行,将代码更改为:
Event.observe(this.element, "dblclick", this.onDblclick.bindAsEventListener(this));
这里我们是给输入框加入了一个新的监听器,让框入框监听双击事件。
第126行,onKeyPress: function(event),复制整个方法,新方法为:
onDblclick: function(event) {
this.changed = true;
this.hasFocus = true;
if(this.observer) clearTimeout(this.observer);
this.observer = setTimeout(this.onObserverEventEx.bind(this), this.options.frequency*1000);
}
这个方法就是去掉了键盘事件的判断,直接控制显示。
注意,最后一行中将onObserverEvent更改为了onObserverEventEx,也就是说还要再定义一个方法:onObserverEventEx
方法如下:
onObserverEventEx: function() {
this.startIndicator();
this.getUpdatedChoices();
}
在原来的onObserverEvent方法里要判断this.getToken().length>=this.options.minChars
this.getToken().length是输入框输入字符的长度,this.options.minChars是创建autocomplete时传入的参数(从多少个字符开始进行搜索)。我们要实现的是双击输入框就能显示列表,也就是说还没有录入任何内容,所以不需要判断。