Автоматическое предложение Coldfusion мешает моему обработчику изменений jquery?

Я использую автоподсказку ColdFusion для поля UserID. Когда пользователь начинает вводить UserID, всплывает список идентификаторов пользователей (заполняется функцией cfc). Образец кода:

<cfinput name="userID" type="text" value="#userID#" autoSuggest="cfc:Utilities.suggestUser({cfautosuggestvalue})" matchcontains="true" />

Я хочу запускать обработчик, когда я выбираю одно из значений в автопредложении, чтобы я мог использовать выбранное значение в другом месте. JQuery-код:

$('#userID').change(function(){
    var userID = $(this).val();
    $('#otherUserIDField').html(userID);
});

Проблема в том, что когда я нажимаю элемент в списке автозаполнения, событие изменения запускается до того, как выбранная запись будет введена в поле формы. Например, если я ищу пользователя «123456» и начинаю вводить «123», а затем вижу его в списке автозаполнения, я нажимаю «123456» в списке автозаполнения, и событие изменения запускается, в то время как значение поле формы по-прежнему только «123». Я пытался добавить задержку ($('#otherUserIDField').delay(1000).html(userID);), но это не помогло. Есть ли какое-либо другое событие, которое я могу использовать? Есть ли способ обойти это?

Как выполнить код только после выбора самовнушения?


person froadie    schedule 19.06.2012    source источник
comment
.delay(1000) — это фиктивная анимация, она не задерживает ваш вызов .html.   -  person Esailija    schedule 19.06.2012
comment
К вашему сведению - в качестве непрошенного совета (ха) - я бы придерживался jQuery и избегал cfform. cfform подходит для базового прототипирования, но я всегда разбиваю его на части, чтобы заставить его делать то, что я хочу. jquery намного богаче и обычно имеет часть, которая мне нужна для данного поведения.   -  person Mark A Kruger    schedule 19.06.2012


Ответы (2)


В итоге я использовал метод setTimeout. Как упоминалось в комментарии @Esailija, функция delay на самом деле не задерживает вызов html. Я не мог использовать «это» с новым кодом, так как задержка приводит к тому, что фокус больше не находится в текстовом поле.

$('#userID').change(function(){
    setTimeout(function(){
            $('#otherUserIDField').html($('#userID').val());
        }, 1000);
});
person froadie    schedule 19.06.2012
comment
Как человек, который также использовал это, чтобы обойти ту же проблему, я считаю важным отметить, что вы не можете передавать информацию из функции setTimeout, поэтому кодируйте внимательно, если вам нужно вызвать свой код, заключенный в setTimeout, для более чем одной вещи. . - person K_Cruz; 29.10.2012

Лично я бы использовал автономный jQuery, а не встроенный ajax ColdFusion. Вот хороший пример этого в действии с работающей демонстрацией: http://jacktraynor.blogspot.com.au/2012/02/jquery-autocomplete-using-coldfusion.html

person Paul    schedule 21.06.2012