Я пытаюсь изменить jQuery's autocomplete widget, чтобы изменить цвет фона ввода, пока скрипт ищет предложения. Вот моя попытка (или посмотреть на my attempt on jsfiddle):Как добавить значок `loading ...` в виджет автозаполнения jQuery UI
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
, затем станет зеленым (как ожидается после открытого события). Если, однако, я набираю a
(несуществующее значение), цвет фона становится красным без проблем (обратите внимание, что событие open никогда не происходит в этом случае, потому что не найдено соответствующего значения). Что тут происходит?
Для любопытных, в конечном счете, я пытаюсь показать маленькую loading
значок во время поиска (функция, которую я удивляюсь, не поставляется с виджетами из коробки). Изменение цвета фона - это первый шаг в этом направлении.
UPDATE
Я сделал another attempt, который показывает, что инструкция, следующая console.log
действительно называется, но визуальные эффекты появляются гораздо позже. Вот код, я использую:
$("#numbers").autocomplete({
source: numbers,
search: function (event, ui) {
console.log('search event fired');
$('#numbers').css({
marginTop: "5em"
});
console.log('search callback done');
}
});
Если вы попробуете это, вы увидите, что оба сообщения регистрируются до поля вытесняются добавлением верхнего края. Каким-то образом маржа добавляется в нужное время, но страница не перерисовывается в нужное время ...
http://stackoverflow.com/questions/3843054/jquery-ui-autocomplete-ui-autocomplete-loading – user1477388
http://stackoverflow.com/questions/4489607/jquery-autocomplete-how-to-show-an -animated-gif – user1477388
@ user1477388 Ни одна из этих ссылок не оказалась полезной. Это вы имели в виду? http://jsfiddle.net/Shawn/FTP8s/ – Shawn