Réponses:
Aucun événement n'est déclenché pour le moment (à partir de 7.34), mais il y a un correctif sur ce problème qui devrait vous permettre d'utiliser quelque chose comme:
$('#input-id').on('autocompleteSelect', function(event, node) {
});
ou si vous utilisez une ancienne version de jQuery
$('#input-id').bind('autocompleteSelect', function(event, node) {
});
Où se nodetrouve l'élément sélectionné. Vous devriez pouvoir obtenir le à tidpartir d'une des propriétés de cet objet.
Drupal 7 et 8 fournissent la génération d'événements de saisie semi-automatique jQuery sans aucun code personnalisé pour le moment.
Dans Drupal 7, l' autocompleteSelectévénement a été ajouté dans le problème Drupal # 365241 . (Clive a mentionné que c'était en cours lorsqu'il a publié sa réponse.)
Drupal 8 utilise le widget de saisie semi-automatique jQuery UI . L' autocompletecloseévénement est l'événement jQuery UI le plus similaire à l' autocompleteSelectévénement D7 . Dans D8, l' autocompleteselectévénement jQuery UI sera également déclenché, mais un rappel Ajax sur celui-ci ne recevra pas de valeurs d'état de formulaire mises à jour. autocompletecloseles rappels sont fournis avec des valeurs d'état de formulaire mises à jour, ce qui est généralement ce que vous voulez.
Comme les autres réponses l'ont indiqué, vous pouvez utiliser les données d'événement dans le navigateur client en utilisant un gestionnaire d'événement jQuery on ou Drupal.behaviors ( Drupal 7 , Drupal 8 ). Dans Drupal 7, vous utiliseriez l' autocompleteSelectévénement, et sur Drupal 8 autocompleteclose.
Si vous avez besoin de la valeur dans votre code PHP, un rappel Ajax peut être utilisé. Voici quelques instructions sur la façon de procéder dans Drupal 7 ou Drupal 8 .
J'avais besoin d'utiliser un comportement pour le faire fonctionner (grâce au problème mentionné par Clive, et ce commentaire: 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, '');
});
}
};
Dans Drupal 8, cela a changé. Vous pouvez remplacer la fonctionnalité avec le code suivant.
/**
* 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;
}
Remplace le code dans core/misc/autocomplete.js.
Ensuite, dans votre code, vous pouvez écouter
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');
}
})