ええ、これは確かにjQueryUIオートコンプリートについての私の3番目または4番目の質問です。私の最近の悩みは、フォームの「送信」ボタンをクリックしても、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(非表示)入力にすでに値がある場合、無効な名前を入力してから入力ボックスをタブまたはクリックすると、この値がクリアされますが、代わりにフォームSubmit
ボタンをすぐに押すと、変更としてカウントされないようです。 'そしてPOST
データには前のEmployeeNumber値が含まれています-間違った入力であるべきものを'一種の'正しいものにします!
[送信]をクリックすることも変更であることをjQueryに認識させる方法はありますか、それとも入力がクリックされSubmit
たことをjQueryに通知するボタンを取得する方法はありますか?Resource
更新:
結局、私はかなりハッキーな方法と考える方法を使用してこれを回避しました-オートコンプリートボックスの「変更」イベントを放棄し、ユーザーが送信をクリックしたときに手動で一致させました。現在の仕組みでは、ユーザーがオートコンプリートのドロップダウンメニューをクリックして名前を選択すると、EmployeeNumber値にオートコンプリートのjQueryコードが入力されます。ユーザーが名前を入力して送信を押すだけの場合、代わりにforceCheck()関数によって照合が行われます。もちろん、この関数は、2番目の同一の名前があるかどうかに関係なく、自動的に名と照合されますが、残念ながら、これまでに見た中で最も奇妙な癖のように見えますが、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関数の残りが実行されない理由を知っているなら...そうでなければ、私は明日私自身の質問への答えとしてこの投稿を投稿します、できる限り受け入れます(2日後だと思います)。
最終更新:
ええと、24時間以上経ちました(かなり長い時間です)ので、私は自分の解決策を「答え」として投稿しました。あと数日置いておき、それでも他に答えがない場合は受け入れます。