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 node
trouve l'élément sélectionné. Vous devriez pouvoir obtenir le à tid
partir 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. autocompleteclose
les 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');
}
})