Посмотрите на misc / autocomplete.js.
/**
* Attaches the autocomplete behavior to all required fields
*/
Drupal.behaviors.autocomplete = function (context) {
var acdb = [];
$('input.autocomplete:not(.autocomplete-processed)', context).each(function () {
var uri = this.value;
if (!acdb[uri]) {
acdb[uri] = new Drupal.ACDB(uri);
}
var input = $('#' + this.id.substr(0, this.id.length - 13))
.attr('autocomplete', 'OFF')[0];
$(input.form).submit(Drupal.autocompleteSubmit);
new Drupal.jsAC(input, acdb[uri]);
$(this).addClass('autocomplete-processed');
});
};
Атрибут значения ввода используется для создания ACDB, который представляет собой кэш значений для этого пути автозаполнения (uri). Это используется в функции Drupal.jsAC, чтобы связать события keydown, keyup и blur элемента с триггерами ajax-операции автозаполнения (которая кэширует свои значения в объекте ACDB для этого элемента), открывает всплывающие окна и т. Д.
/**
* An AutoComplete object
*/
Drupal.jsAC = function (input, db) {
var ac = this;
this.input = input;
this.db = db;
$(this.input)
.keydown(function (event) { return ac.onkeydown(this, event); })
.keyup(function (event) { ac.onkeyup(this, event); })
.blur(function () { ac.hidePopup(); ac.db.cancel(); });
};
Что вам нужно сделать, это изменить значение ввода, а также заново подключить поведение. Повторите это поведение, удалив класс .autocomplete-processing в элемент ввода текстового поля автозаполнения, а затем вызовите Drupal.attachBehaviors (thatInputElement).
Это может не сработать. Все может пойти очень плохо, если вы снова и снова присоединяете одно и то же поведение к одному и тому же элементу. Может быть более разумно создавать различные поля автозаполнения и просто скрывать и показывать их в зависимости от значения выбора. Это по-прежнему требует вызова Drupal.attachBehaviors, когда вы скрываете и отображаете виджет, но такое же поведение останется подключенным, если переключение произошло более одного раза, и вы не рискуете присоединить одно и то же поведение к элементу несколько раз.