Respostas:
Nenhum evento é acionado no momento (a partir da 7.34), mas há um patch sobre esse problema que deve permitir que você use algo como:
$('#input-id').on('autocompleteSelect', function(event, node) {
});
ou se você estiver usando na versão antiga do jQuery
$('#input-id').bind('autocompleteSelect', function(event, node) {
});
Onde node
está o item selecionado. Você deve conseguir obter tid
uma das propriedades desse objeto.
Drupal 7 e 8 fornecem a geração de eventos de preenchimento automático do jQuery sem nenhum código personalizado no momento.
No Drupal 7, o autocompleteSelect
evento foi adicionado na edição Drupal # 365241 . (Clive mencionou que isso estava em andamento quando ele postou sua resposta.)
O Drupal 8 usa o widget de preenchimento automático da UI do jQuery . O autocompleteclose
evento é o evento da UI do jQuery mais semelhante ao autocompleteSelect
evento D7 . No D8, o autocompleteselect
evento da UI do jQuery também será acionado, mas um retorno de chamada do Ajax não receberá valores atualizados do estado do formulário. autocompleteclose
retornos de chamada são fornecidos com valores atualizados do estado do formulário, que geralmente é o que você deseja.
Como as outras respostas indicaram, você pode usar os dados do evento no navegador do cliente usando um jQuery no manipulador de eventos ou Drupal.behaviors ( Drupal 7 , Drupal 8 ). No Drupal 7 você usaria o autocompleteSelect
evento e no Drupal 8 autocompleteclose
.
Se você precisar do valor em seu código PHP, um retorno de chamada Ajax pode ser usado. Aqui estão algumas instruções de como fazer isso no Drupal 7 ou no Drupal 8 .
Eu precisava usar um comportamento para fazê-lo funcionar (graças ao problema mencionado por Clive e este comentário: 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, '');
});
}
};
No Drupal 8, isso mudou. Você pode substituir a funcionalidade pelo código a seguir.
/**
* 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;
}
Substitui o código em core/misc/autocomplete.js
.
Então, no seu código, você pode ouvir
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');
}
})