2009-08-12 1 views
2

Нам нужна возможность вызывать обработчик, если пользователь вводит текст без, выбирая из набора предложений автозаполнения.Как определить, когда пользователь игнорирует предложения автозаполнения jQuery

В нашем случае не имеет значения, совпадает ли введенный текст с любыми значениями автозаполнения или нет - нам остается только, если пользователь нажимает/выбирает значение автозаполнения, или нет.

Способ нашей формы заключается в том, что пользователь начинает вводить фамилию контакта и получает предложения автозаполнения, включая полное имя и компанию контакта. Если пользователь выбирает одно из предложений автозаполнения, мы заполняем несколько полей. Все работает нормально.

Новое требование состоит в том, что если пользователь НЕ выбирает одно из предложений, нам нужно вычеркнуть несколько полей, которые мы хотели бы реализовать, используя обработчик, вызванный из библиотеки автозаполнения.

Глядя на previousanswers, это не выглядит, как мы можем сделать это с Jörn Zaefferer's autocomplete plugin, но если у вас есть патч или некоторое представление о том, как реализовать эту функцию, это библиотека, мы бы попробовать и столкнуть ее в.

ответ

0

Я бы подумал, что простой способ сделать это - сохранить массив текстовых предложений и сравнить их с тем, что действительно введено в текстовое поле. Сделайте это onblur или onsubmit. Посмотрите в массив для фактического ввода ... если он не существует, они ввели свой собственный текст.

+0

Две проблемы с этим: 1 тривиальный - пользователю разрешено сознательно игнорировать автоматическое заполнение, если дополнительная метаинформация неверна, т. Е. Ввод «Siemer» может автоматически дополняться «Andrew Siemer (StackOverflow)» - который будет заполняться три поля с «Siemer», «Andrew» и «StackOverflow» - но они проигнорировали этот вариант, потому что они вводят информацию для Боб Siemer в Acme Corp. Во-вторых, заказ событий - это кошмар. onsubmit слишком поздно, и onblur конфликтует с тем, как работает автозаполнение (onblur триггеры, когда пользователь выбирает значения автозаполнения с помощью мыши, что приводит к состоянию гонки.) – searlea

0

Этот плагин вызывает событие result, когда пользователь выбирает результат. Просто инициализируйте переменную в true при загрузке страницы, затем установите значение равно false в «result» even и проверьте, соответствует ли она true. Что-то вроде

(function() { 
    var typed_in = true; 
    $("#auto").bind("result", function() { typed_in = false }); 
    $("#form").blur(function() { 
    if (typed_in) { 
     // do stuff 
    } else { 
     // do other stuff 
    } 
    typed_in = true; 
    }); 
)(); 
+0

Я читал это как предложение с использованием глобальной переменной состояния? Нам нужно использовать переменные с областью/закрытым/expando, чтобы обслуживать несколько полей автозаполнения. Большая проблема: мы не можем зацепиться за 'form.submit (fn)', поскольку мы пытаемся помочь заполнить форму, а не реализовывать проверку (т. Е. Нам нужно подключиться к фокусу (fn) 'или' blur (fn) 'в отдельных полях, так как пользователь прокладывает себе путь через форму, а не как только они закончены) – searlea

+0

ok, затем используйте onblur с закрытой переменной. пример изменен –

1

Ну, вот как я это сделал, на случай, если это поможет. Я очистил значение скрытого поля всякий раз, когда поле автозаполнения осталось без предложения.

Я считаю, что функция search() делает фактическую проверку, что вы хотите, и если result() вызываются без data элемента, то вы знаете, что автозаполнение не использовалось.

autocompleteField.result(function(event, data, formatted) { 
    if (data) { 
     //auto-complete matched 
     //NB: this might get called twice, but that's okay 
    } 
    else { 
     //must have been triggered by search() below 
     //there was no match 
    } 
}); 

autocompleteField.blur(function(){ 
    autocompleteField.search(); //trigger result() on blur, even if autocomplete wasn't used 
}); 
+0

это хорошо работает, если пользователь не нажимает на результат автозаполнения, слишком рано откладывает поиск –

+0

@npdoty, где использовать метод результата и как? firebug показывает, что метод не определен или bla bla bla. –

2

jQuery autocomplete имеет некоторые полезные функции, которые вы можете использовать для решения проблемы. , если использование игнорирует autocomplete sugestion, тогда вы можете использовать ниже код для выбранных значений из sugestion.

Предположим, ваше имя входного автозаполнение «txtName», то вы можете написать код, как:

$('#txtName').change(function(me) { $('#txtName').search(); }); 
7

Я встречал очень интересный ответ. Это касается того, как плагины jQuery управляют своим статусом. Когда я смотрел на firebug (с помощью firequery), я обнаружил, что когда я щелкнул значок, показывающий свойства jQuery узла DOM (на вкладке HTML), он показал все данные плагина, прикрепленные к узлу DOM и прикрепленные к ним, это все параметры автозаполнения. Таким образом, я нашел решение.

$('#test').autocomplete({ 
    change:function(event, ui) { 
     var data=$.data(this);//Get plugin data for 'this' 
     if(data.autocomplete.selectedItem==undefined) 
      alert("manual"); 
     else 
      alert("selected");  
    } 
}); 

Что автозаполнения делает то, что если мы выбираем из списка, то SelectedItem содержит объект JSON, мы только выбранные со всеми его свойствами. Но если мы нажмем ESC или Отмените автозаполнение, оно будет установлено в нуль.

+1

Я нашел еще одну информацию. На самом деле вы можете использовать аргумент «ui», поскольку он такой же, как selectedItem. Так что не нужно идти длинным путем, но я оставил выше ответа, чтобы вы могли использовать и другие параметры. –

+0

как на земле вы, ребята, находите эти трюки .. просто супер. – Raghav