【发布时间】:2010-07-27 12:54:43
【问题描述】:
是的,这确实是我关于 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(隐藏)输入已经有一个值,输入一个无效的名称,然后在输入框上跳动或单击会清除这个值,但是如果您立即点击表单 @987654322 @ 按钮,它似乎不算作“更改”,POST 数据包括以前的 EmployeeNumber 值 - 使不正确的输入“有点”正确!
是否有某种方法可以让 jQuery 认识到单击“提交”也是一种更改,或者我可以通过某种方法获得 Submit 按钮来通知 jQuery Resource 输入已被点击关闭的?
更新:
最后,我通过使用我认为相当老套的方法解决了这个问题——我放弃了自动完成框的“更改”事件,并在用户单击提交时手动匹配自己。它现在的工作方式是,如果用户通过单击自动完成下拉菜单选择名称,则 EmployeeNumber 值将由自动完成 jQuery 代码填充。如果用户只是键入名称并点击提交,则匹配由 forceCheck() 函数完成。当然,无论是否有第二个相同的名字,这个函数都会自动匹配第一个名字,但不幸的是,在我见过的 weirdest 怪癖中,结束后的任何代码即使循环中没有“return”语句,该 for 循环的 not 也会被执行。循环完成后,提交请求继续......这太奇怪了。
<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 小时(更多),所以我将我的解决方案发布为“答案”。我会再放几天,如果仍然没有其他答案,我会接受它。
【问题讨论】:
-
有点困惑。甚至从提交按钮的
onclick事件尝试手动触发资源输入onblur。在 change 函数中添加了alert语句以查看它是否有效。当我点击Submit时,警报触发了,但 EmployeeNumber 在 POST 中没有更改 - 就像在 onclick 事件触发之前,或者至少在 change 事件触发之前已经记录了它一样。 -
确实如此。通过向
change函数添加多个“警报”来测试代码。只需单击关闭,它们都会运行。当change函数由于单击提交按钮而运行时,唯一运行的是第一个。即使我连续放置两个alerts,也只有第一个运行 - 如果我不先发出警报,我不知道是否有任何运行...... -
啊,我错了。强制
onblur事件不会 启动change事件 - 我收到警告框的原因是自动完成确实注册了change,就在提交方法已经开始之后加工。我通常设法获得一个警报框的原因是由于在处理发生时离开页面之前的延迟......
标签: javascript jquery html jquery-autocomplete jquery-ui-autocomplete