我使用jQuery UI庫(http://jqueryui.com/demos/autocomplete/#combobox)的autocombox。組合框代替標準的asp.net web窗體下拉列表控件,它的autopostback屬性設置爲true。有沒有一種方法可以在此控件上「繼承」事件處理程序,或者有什麼方法可以確定在組合框中發生了「選擇」或「更改」事件,因此我可以自行啓動回發?jQuery ui.combobox和asp.net web窗體autopostback
編輯:
添加我的組合框代碼:
(function($) {
$.widget("ui.combobox", {
_create: function() {
var self = this;
var width = this.element.width() > 100 ? "style='width:"+this.element.width()+"px'" : "";
self.select = this.element.hide();
var v = self.select.children(":selected").text();
self.span = $("<span>")
.insertAfter(self.select)
.addClass(self.select.attr("class"))
.addClass("ui-combobox");
self.input = $("<input "+width+">")
.appendTo(self.span)
.autocomplete({
source: function(request, response) {
var matcher = new RegExp(request.term, "i");
response(self.select.children("option").map(function() {
var text = $(this).text();
if (!request.term || matcher.test(text))
return {
id: $(this).val(),
label: text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" +
request.term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,
"\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"),
value: text
};
}));
},
delay: 0,
select: function(e, ui) {
if (!ui.item) {
// remove invalid value, as it didn't match anything
$(this).val("");
return false;
}
$(this).focus();
self.select.val(ui.item.id);
self._trigger("selected", null, {
item: self.select.find("[value='" + ui.item.id + "']")
});
},
change: function(event, ui) {
if (!ui.item) {
var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex($(this).val()) + "$", "i"),
valid = false;
select.children("option").each(function() {
if (this.value.match(matcher)) {
this.selected = valid = true;
return false;
}
});
if (!valid) {
// remove invalid value, as it didn't match anything
$(this).val("");
select.val("");
return false;
}
}
},
minLength: 0
})
.val(v)
.addClass(self.select.attr("class"))
.addClass("ui-widget-content ui-corner-left ui-combobox-input")
.myHover();
$("<div></div>")
.appendTo(self.span)
.button({
icons: {
primary: "ui-icon-triangle-1-s"
},
text: false
}).removeClass("ui-corner-all")
.addClass(self.select.attr("class"))
.addClass("ui-corner-right ui-button-icon ui-combobox-button")
.position({
my: "left center",
at: "right center",
of: self.input,
offset: "-1 0"
})//.css("top", "")
.click(function() {
// close if already visible
if (self.input.autocomplete("widget").is(":visible")) {
self.input.autocomplete("close");
return;
}
// pass empty string as value to search for, displaying all results
self.input.autocomplete("search", "");
self.input.focus();
self.input.get(0).select();
});
},
setValue: function(v) {
this.select.val(v);
this.input.val(this.select.children(":selected").text());
}
//_trigger("change", e, ui);
});
})(jQuery);
這也行不通。 – lloydphillips
我已將我的組合框代碼添加到問題中。我認爲它和jQuery UI中的一樣,不知道我們是否做了一些細微的修改。 – lloydphillips
實際上,它必須處理的事實是,您必須找到一種方法將此觸發器綁定到(我認爲)自動填充小部件的菜單元素的模糊事件。我昨天晚上正在對它進行一些研究,但今天晚些時候會再看。這是由於我認爲自動填充小部件的不完整事件模式。有一個事件可以截取元素的選擇,並且在輸入已經模糊以「確認」一個改變之後,但是在輸入被來自所選項目的文本更新之後沒有事件。 – lsuarez