Quel est l'événement déclenché après l'exécution d'une saisie semi-automatique et comment récupérer la valeur sélectionnée

8

J'ai un formulaire d'ajout de nœud avec une référence de terme qui utilise un widget de saisie semi-automatique.

Je veux que le terme rempli soit rempli par l'utilisateur à l'aide du widget de saisie semi-automatique.

sel_space
la source

Réponses:

13

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.

Clive
la source
Merci pour la réponse J'ai également trouvé une autre solution décrite sur ce billet de blog: brockboland.com/drupaldork/2013/01/…
sel_space
@Clive: Est-ce que ce travail est effectué pour la recherche de saisie semi-automatique? J'ai une requête ici drupal.stackexchange.com/questions/286399/…
Suraj
3

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 .

Keithm
la source
1

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, '');

      });
    }
  };
tyler.frankenstein
la source
0

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');
    }
  })
Jason Yarrington
la source
L'utilisation d'un remplacement de ce formulaire n'est pas une bonne pratique. Si deux de ces remplacements sont placés dans un site avec des noms d'événement légèrement différents, par exemple, 'autocomplete-select' et 'autocompleteSelect', le dernier attribué aura la priorité et le premier événement ne sera jamais déclenché. En outre, Drupal 7 et 8 déclenchent tous deux des événements appropriés sans code supplémentaire. Voir ma réponse drupal.stackexchange.com/a/228150/2272 .
Keithm
Drupal.autocomplete.options.select = fonction selectHandler (event, ui) {Échoue, quand aucun champ de saisie semi-automatique n'est disponible sur la page spécifique. Vous devez implémenter une vérification pour vous assurer que le champ de saisie semi-automatique existe. Sinon, vous freinerez votre JS. Vous obtiendrez alors de telles erreurs:> Uncaught TypeError: Impossible de lire la propriété 'options' de indéfinie à node-form.js: 94 à node-form.js: 113
jepster