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');
});
};
入力の value 属性は、そのオートコンプリート パス (uri) の値のキャッシュである ACDB を作成するために使用されます。これは 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-processed」クラスを削除して動作を再アタッチし、Drupal.attachBehaviors(thatInputElement) を呼び出します。
これはうまくいかないかもしれません。同じ動作を同じ要素に何度も適用すると、事態は非常に悪化する可能性があります。さまざまなオートコンプリート フィールドを作成し、select の値に基づいて単純に表示または非表示にする方が賢明な場合があります。これには、ウィジェットを非表示および表示するときに Drupal.attachBehaviors を呼び出す必要がありますが、切り替えが複数回発生した場合でも同じ動作がアタッチされたままになり、同じ動作を要素に複数回アタッチするリスクはありません。