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 node
jest wybrany element. Powinieneś być w stanie uzyskać tid
jedną 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 autocompleteSelect
wydarzenie 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 . autocompleteclose
Zdarzenie jest zdarzeniem jQuery UI najbardziej podobny do D7 autocompleteSelect
imprezy. W D8 autocompleteselect
również zostanie wyzwolone zdarzenie interfejsu użytkownika jQuery, ale wywołanie zwrotne Ajax na nim nie otrzyma zaktualizowanych wartości stanu formularza. autocompleteclose
wywoł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 autocompleteSelect
wydarzenia, 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');
}
})