Wystarczy popatrzeć na 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');
});
};
atrybut wartość wejście jest wykorzystywane do tworzenia ACDB, który jest cache wartości dla tej ścieżki autouzupełniania (URI). Która jest używana w funkcji Drupal.jsAC związać keyDown, keyUp i rozmycia zdarzenia tego elementu z wyzwala działanie autouzupełnianie AJAX (który buforuje swoje wartości w obiekcie ACDB dla tego elementu), otwiera wyskakujące okienka itd
/**
* 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(); });
};
To, co musisz zrobić, to zmienić wartość wejściową i ponownie ją przywrócić. Przywrócisz działanie, usuwając klasę ".autocomplete-processing" z elementu wejściowego pola tekstowego autouzupełniania, a następnie wywołując Drupal.attachBehaviors (thatInputElement).
To może nie działać. Sprawy mogą pójść bardzo źle, jeśli przywrócisz to samo zachowanie do tego samego elementu w kółko. Bardziej sensowne może być tworzenie różnych pól autouzupełniania i po prostu ukrywanie i pokazywanie ich na podstawie wartości zaznaczenia. Będzie to nadal wymagało wywoływania Drupal.attachBehaviors po ukryciu i wyświetleniu widżetu, ale to samo zachowanie pozostanie dołączone, jeśli zmiana nastąpi więcej niż raz i nie ryzykujesz wielokrotnego przywiązywania tego samego zachowania do elementu.
To nie wydaje się działać. Podobno URL jest przechowywany gdzieś w kodzie JavaScript i nie jest ponownie czytany z pola wejściowego. – mikl
Musisz również usunąć klasę 'autocomplete-processed' z ukrytego pola, a następnie ponownie dołączyć zachowanie autouzupełniania, wywołując' Drupal.behaviors.autocomplete (document); '. – sepehr
działa, ale przy każdych zmianach jest rejestrowany nowy adres URL, jeśli 2 razy zostanie ponownie dołączony, wszystkie 3 połączenia zostaną wykonane na serwerze –