Respuestas:
No se activa ningún evento en este momento (a partir de 7.34), pero hay un parche sobre este problema que debería permitirle usar algo como:
$('#input-id').on('autocompleteSelect', function(event, node) {
});
o si estás usando una versión anterior de jQuery
$('#input-id').bind('autocompleteSelect', function(event, node) {
});
¿Dónde node
está el artículo seleccionado? Debería poder obtener tid
una de las propiedades de ese objeto.
Drupal 7 y 8 proporcionan generación de eventos de autocompletado jQuery sin ningún código personalizado en este momento.
En Drupal 7, el autocompleteSelect
evento se agregó en el número de Drupal # 365241 . (Clive mencionó que esto estaba en progreso cuando publicó su respuesta).
Drupal 8 utiliza el widget de autocompletar jQuery UI . El autocompleteclose
evento es el evento jQuery UI más similar al autocompleteSelect
evento D7 . En D8, el autocompleteselect
evento jQuery UI también se activará, pero una devolución de llamada Ajax en él no recibirá valores de estado de formulario actualizados. autocompleteclose
las devoluciones de llamada se proporcionan con valores de estado de formulario actualizados, que generalmente es lo que desea.
Como lo han indicado las otras respuestas, puede utilizar los datos del evento en el navegador del cliente utilizando un jQuery en el controlador de eventos o Drupal.behaviors ( Drupal 7 , Drupal 8 ). En Drupal 7 usarías el autocompleteSelect
evento, y en Drupal 8 autocompleteclose
.
Si necesita el valor en su código PHP, se puede usar una devolución de llamada Ajax. Aquí hay algunas instrucciones sobre cómo hacer esto en Drupal 7 o en Drupal 8 .
Necesitaba usar un comportamiento para que funcione (gracias al problema mencionado por Clive, y este comentario: 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, '');
});
}
};
En Drupal 8 esto se ha movido. Puede anular la funcionalidad con el siguiente código.
/**
* 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;
}
Invalida el código en core/misc/autocomplete.js
.
Luego en tu código puedes escuchar
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');
}
})