是的,这确实是我关于 jQuery UI 自动完成的第三个或第四个问题。我最近的烦恼是单击表单中的“提交”按钮似乎不算作 jQuery 的“更改”。当我的输入框发生变化时,jQuery 会运行一些 javascript 来强制匹配可接受的输入列表及其值:
jQuery("#Resource").autocomplete({
source: function( request, response ) {
var matcher = new RegExp(jQuery.trim(request.term).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i" );
var matches = jQuery.grep(resources, function(value) {
return matcher.test( value.label || value.value || value );
});
response(matches.length ? matches : [{ label: "No Result Found", value: "" }]);
},
focus: function(event, ui) {
jQuery('#Resource').val(ui.item.label);
return false;
},
select: function(event, ui) {
jQuery('#Resource').val(ui.item.label);
jQuery('#EmployeeNumber').val(ui.item.value);
return false;
},
change: function(event,ui) {
for(var i in resources){
jQuery('#EmployeeNumber').val("");
if(resources[i].label.toLowerCase()==jQuery('#Resource').val().toLowerCase()) {
jQuery('#EmployeeNumber').val(resources[i].value);
break;
}
}
}
});
如果 EmployeeNumber (hidden) 输入已经有一个值,输入一个无效的名称,然后按 Tab 键或单击输入框会清除该值,但是如果您立即点击表单Submit
按钮,它似乎不算作“更改” ' 并且POST
数据包括以前的 EmployeeNumber 值 - 使应该是不正确的输入“有点”正确!
是否有某种方法可以让 jQuery 认识到单击“提交”也是一种更改,或者我可以通过某种方法让Submit
按钮通知 jQueryResource
输入已被单击?
更新:
最后,我通过使用我认为相当老套的方法解决了这个问题——我放弃了自动完成框的“更改”事件,并在用户单击提交时手动匹配自己。它现在的工作方式是,如果用户通过单击自动完成下拉菜单选择名称,则 EmployeeNumber 值将由自动完成 jQuery 代码填充。如果用户只是键入名称并点击提交,则匹配由 forceCheck() 函数完成。当然,无论是否有第二个相同的名字,这个函数都会自动匹配第一个名字,但不幸的是,在我见过的最奇怪的怪癖中,for循环结束后的任何代码都不会被执行,即使循环中没有'return'语句。循环完成后,提交请求继续......这非常奇怪。
<fieldset class="submit">
<input id="Submit" name="Submit" type="Submit" class="Submit" value ="Submit" onclick="document.getElementById('Resource').value = jQuery.trim(document.getElementById('Resource').value);forceCheck();"/>
</fieldset>
...
<script type="text/javascript">
...
// Force a resource name check when the user hits the submit button. Necessary because if user changes Resoruce
// input then hits submit directly (no click or tab off), the jQuery 'change' event (see below) isn't fired
// until *after* the submit button has begun processing, which is too late.
function forceCheck() {
for(var i in resources) {
document.getElementById("EmployeeNumber").value = "";
if(resources[i].label.toUpperCase() == document.getElementById("Resource").value.toUpperCase()) {
document.getElementById("EmployeeNumber").value = resources[i].value;
return;
}
}
}
jQuery(function(){
jQuery("#Resource").autocomplete({
source: function( request, response ) {
var matcher = new RegExp(jQuery.trim(request.term).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i" );
var matches = jQuery.grep(resources, function(value) {
return matcher.test( value.label || value.value || value );
});
response(matches.length ? matches : [{ label: "No Result Found", value: "" }]);
},
focus: function(event, ui) {
jQuery('#Resource').val(ui.item.label);
return false;
},
select: function(event, ui) {
jQuery('#Resource').val(ui.item.label);
jQuery('#EmployeeNumber').val(ui.item.value);
return false;
},
});
});
</script>
如果有人知道比这更好的方法,我将非常感谢您的回答 - 或者如果您知道为什么我的 forceCheck 函数的其余部分可能无法运行......否则,我明天将发布这篇文章作为我自己问题的答案,并在可能的情况下接受它(我相信两天后)。
最终更新:
好吧,已经超过 24 小时(更多),所以我将我的解决方案发布为“答案”。如果仍然没有其他答案,我会再放几天然后接受它。