我正在尝试扩展jQuery UI自动完成小部件。在我的自定义小部件中,我需要能够覆盖选择事件,并且最好还允许小部件的用户附加自己的处理程序到该事件上。
这是我尝试之一的jsfiddle:http://jsfiddle.net/nN46R/ 我第一个尝试(在jsfiddle中)是在
这个方法没有生效。如果你将
这是我尝试之一的jsfiddle:http://jsfiddle.net/nN46R/ 我第一个尝试(在jsfiddle中)是在
_create
中绑定事件:$.widget("custom.myautocomplete", $.ui.autocomplete, {
_create: function() {
this._super("_create");
// Doesn't work
this.element.bind('autocompleteselect', function() {
alert('Handling autocompleteselect!');
});
}
});
这个方法没有生效。如果你将
autocompleteselect
更改为select
,它会触发,但只有在文本框中高亮显示任何文本时才会触发 - 但那只是jQuery的select处理程序被触发,而不是jQuery UI的autocompleteselect。这不是我想要的。
根据此帖子,我尝试在小部件中定义了一个_select
方法:
$.widget("custom.myautocomplete", $.ui.autocomplete, {
_create: function() {
this._super("_create");
},
_select: function (event, ui) {
alert('Handling select!');
}
});
这个也不起作用。我尝试了同样的方法,只使用了select
(没有下划线),但是没成功。
唯一起作用的方法是使用options
数组传入默认处理程序,像这样(jsfiddle):
$.widget("custom.myautocomplete", $.ui.autocomplete, {
options: {
select: function (event, ui) {
alert('Handling select!');
}
}
});
但是这种方式存在一些问题。首先,在处理程序内部似乎无法调用自定义小部件中的任何其他方法:
$.widget("custom.myautocomplete", $.ui.autocomplete, {
options: {
select: function (event, ui) {
alert('Handling select!');
// Doesn't work:
// Uncaught TypeError: Object #<HTMLInputElement> has no method '_myCustomSelectHandler'
this._myCustomSelectHandler();
}
},
_myCustomSelectHandler: function (event, ui) {
alert('In _myCustomSelectHandler!');
}
});
其次,如果用户定义了自己的 select
处理程序,则我的处理程序将不再触发:
$("#tags").myautocomplete({
delay: 0,
source: availableTags,
select: function (e, ui) {
alert("Muahaha! Me (the user) just overrode the select handler, and now yours won't get called!");
}
});
那看起来并不像是一个解决方案。
那么,我是否有任何方法可以扩展自动完成小部件并覆盖select
处理程序?