Odpowiedzi:
W tej chwili żadne zdarzenie nie jest wyzwalane (od 7.34), ale jest łatka na ten problem, która powinna pozwolić ci użyć czegoś takiego:
$('#input-id').on('autocompleteSelect', function(event, node) {
});
lub jeśli korzystasz ze starej wersji jQuery
$('#input-id').bind('autocompleteSelect', function(event, node) {
});
Gdzie nodejest wybrany element. Powinieneś być w stanie uzyskać tidjedną z właściwości tego obiektu.
Drupal 7 i 8 zapewniają w tej chwili generowanie zdarzeń autouzupełniania jQuery bez żadnego niestandardowego kodu.
W Drupal 7 autocompleteSelectwydarzenie zostało dodane w numerze Drupal # 365241 . (Clive wspomniał, że to się dzieje, kiedy opublikował swoją odpowiedź).
Drupal 8 korzysta z widgetu autouzupełniania interfejsu użytkownika jQuery . autocompletecloseZdarzenie jest zdarzeniem jQuery UI najbardziej podobny do D7 autocompleteSelectimprezy. W D8 autocompleteselectrównież zostanie wyzwolone zdarzenie interfejsu użytkownika jQuery, ale wywołanie zwrotne Ajax na nim nie otrzyma zaktualizowanych wartości stanu formularza. autocompleteclosewywołania zwrotne są dostarczane ze zaktualizowanymi wartościami stanu formularza, co zwykle jest tym, czego chcesz.
Jak wskazały inne odpowiedzi, możesz skorzystać z danych zdarzeń w przeglądarce klienta, używając jQuery w module obsługi zdarzeń lub Drupal.behaviors ( Drupal 7 , Drupal 8 ). W Drupal 7 używałbyś tego autocompleteSelectwydarzenia, a na Drupal 8 autocompleteclose.
Jeśli potrzebujesz wartości w kodzie PHP, możesz użyć wywołania zwrotnego Ajax. Oto kilka wskazówek, jak to zrobić w Drupal 7 lub w Drupal 8 .
Musiałem użyć zachowania, aby to zadziałało (dzięki problemowi wspomnianemu przez Clive i temu komentarzowi: https://www.drupal.org/node/365241#comment-9575707 ):
Drupal.behaviors.autocompleteSupervisor = {
attach: function (context) {
$('#edit-field-foo-und-0-target-id', context).bind('autocompleteSelect', function(event, node) {
// Do custom stuff here...
var entity_id = $(this).val().replace($(node).text().trim(), '').replace(/\(|\)| /g, '');
});
}
};
W Drupal 8 to się zmieniło. Możesz zastąpić funkcjonalność następującym kodem.
/**
* Handles an autocompleteselect event.
*
* Override the autocomplete method to add a custom event.
*
* @param {jQuery.Event} event
* The event triggered.
* @param {object} ui
* The jQuery UI settings object.
*
* @return {bool}
* Returns false to indicate the event status.
*/
Drupal.autocomplete.options.select = function selectHandler(event, ui) {
var terms = Drupal.autocomplete.splitValues(event.target.value);
// Remove the current input.
terms.pop();
// Add the selected item.
if (ui.item.value.search(',') > 0) {
terms.push('"' + ui.item.value + '"');
}
else {
terms.push(ui.item.value);
}
event.target.value = terms.join(', ');
// Fire custom event that other controllers can listen to.
jQuery(event.target).trigger('autocomplete-select');
// Return false to tell jQuery UI that we've filled in the value already.
return false;
}
Przesłania kod w core/misc/autocomplete.js.
Następnie w kodzie możesz słuchać
var field = jQuery('<field-selector>');
var lastField = ''
field.on('autocomplete-select', function() {
console.log("autocompleteSelect");
// Check that field actually changed.
if ($(this).val() != lastValue) {
lastValue = $(this).val();
console.log('The text box really changed this time');
}
})