jQuery のオートコンプリート ウィジェットを変更して、スクリプトが候補を検索している間に入力の背景色が変化するようにしようとしています。これが私の試みです(またはjsfiddle での私の試みを見てください):
html
<label for="numbers">Numbers: </label>
<input id="numbers" />
JavaScript
var numbers = [],
nb = 10000,
i;
for (i = 0; i < nb; i += 1) {
numbers.push(i.toString());
}
function color (color) {
$('#numbers').css({
background: color
});
}
$("#numbers").autocomplete({
source: numbers,
search: function (event, ui) {
console.log('search event fired');
color("red");
},
open: function (event, ui) {
console.log('open event fired');
color("green");
},
close: function (event, ui) {
console.log('close event fired');
color("white");
}
});
ご覧のとおり、search
、 、open
およびclose
イベントをログに記録しているので、それらがいつ発生したかを確認できます。
予想どおり、5
(既存の値)を入力するsearch
と、イベントが発生し、対応するメッセージがログに記録されます。数秒後に、open
イベントが発生し、対応するメッセージがログに記録されます。そこに 10000 エントリを入れたので、search
イベントとイベントの間に顕著な遅延がありopen
ます (1 秒程度)。
私を困惑させているのは、search
イベントに関連するログ メッセージが表示されたときに、期待どおりに背景色が赤に変化しないことです。代わりに、イベントが発生するまで白のままopen
で、その後緑になります (open イベントの後で予想どおり)。ただし、a
(存在しない値) を入力すると、背景色は問題なく赤くなります (この場合、対応する値が見つからないため、open イベントは発生しないことに注意してください)。ここで何が起こっているのですか?
興味深いことに、私は最終的にloading
、検索の進行中に小さなアイコンが表示されるようにしようとしています (驚いたことに、箱から出してすぐにウィジェットに同梱されていない機能がありました)。背景色の変更は、その方向への第一歩です。
アップデート
次の命令が実際に呼び出されることを示す別の試みを行いましたが、視覚効果はずっと後でしか現れません。console.log
私が使用しているコードは次のとおりです。
$("#numbers").autocomplete({
source: numbers,
search: function (event, ui) {
console.log('search event fired');
$('#numbers').css({
marginTop: "5em"
});
console.log('search callback done');
}
});
試してみると、上部マージンの追加によってフィールドが置き換えられる前に、両方のメッセージがログに記録されることがわかります。どういうわけか、余白は適切なタイミングで追加されますが、ページは適切なタイミングで再描画されていません...