Qual è l'evento attivato dopo l'esecuzione di un completamento automatico e come recuperare il valore selezionato


8

Ho un modulo di aggiunta nodo con un termine di riferimento che utilizza il widget di completamento automatico.

Voglio la "tid" del termine compilato dall'utente utilizzando il widget di completamento automatico.

Risposte:


13

Nessun evento è attivato al momento (a partire da 7.34), ma c'è una patch su questo problema che dovrebbe permetterti di usare qualcosa come:

$('#input-id').on('autocompleteSelect', function(event, node) {

});

o se stai utilizzando la vecchia versione di jQuery

$('#input-id').bind('autocompleteSelect', function(event, node) {

});

Dov'è nodel'elemento selezionato. Dovresti essere in grado di ottenere il tidda una delle proprietà su quell'oggetto.


Grazie per la risposta, ho anche trovato un'altra soluzione descritta in questo post sul blog: brockboland.com/drupaldork/2013/01/…
sel_space

@Clive: questo lavoro per la ricerca di API si completa automaticamente? Ho una domanda qui drupal.stackexchange.com/questions/286399/…
Suraj

3

Drupal 7 e 8 forniscono al momento la generazione di eventi con completamento automatico jQuery senza codice personalizzato.

In Drupal 7, l' autocompleteSelectevento è stato aggiunto nel numero Drupal # 365241 . (Clive ha detto che era in corso quando ha pubblicato la sua risposta.)

Drupal 8 utilizza il widget di completamento automatico dell'interfaccia utente jQuery . L' autocompletecloseevento è l'evento dell'interfaccia utente jQuery più simile autocompleteSelectall'evento D7 . In D8 autocompleteselectverrà anche attivato l'evento dell'interfaccia utente jQuery ma un callback Ajax su di esso non riceverà i valori di stato del modulo aggiornati. autocompleteclosei callback vengono forniti con valori di stato del modulo aggiornati, che di solito sono quelli desiderati.

Come indicato dalle altre risposte, è possibile utilizzare i dati degli eventi nel browser client utilizzando un gestore eventi jQuery o Drupal.behaviors ( Drupal 7 , Drupal 8 ). In Drupal 7 useresti l' autocompleteSelectevento e su Drupal 8 autocompleteclose.

Se hai bisogno del valore nel tuo codice PHP, è possibile utilizzare un callback Ajax. Ecco alcune indicazioni su come eseguire questa operazione in Drupal 7 o Drupal 8 .


1

Avevo bisogno di usare un comportamento per farlo funzionare (grazie al problema menzionato da Clive e questo commento: 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, '');

      });
    }
  };

0

In Drupal 8 questo si è spostato. È possibile ignorare la funzionalità con il seguente codice.

/**
 * 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;
}

Sostituisce il codice in core/misc/autocomplete.js.

Quindi nel tuo codice puoi ascoltarlo

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

L'uso di una sostituzione di questo modulo non è una buona pratica. Se due di queste sostituzioni vengono inserite in un sito con nomi di eventi leggermente diversi, ad esempio "completamento automatico-selezione" e "completamento automatico-selezione", l'ultimo assegnato avrà la precedenza e il primo evento non verrà mai attivato. Inoltre, Drupal 7 e 8 attivano entrambi eventi appropriati senza alcun codice aggiuntivo. Vedi la mia risposta drupal.stackexchange.com/a/228150/2272 .
keithm

Drupal.autocomplete.options.select = function selectHandler (event, ui) {Non riesce, quando sulla pagina specifica non è disponibile alcun campo di completamento automatico. È necessario implementare un controllo per assicurarsi che il campo di completamento automatico esista. Altrimenti frenerai il tuo JS. Riceverai tali errori quindi:> Errore di tipo non rilevato: impossibile leggere le 'opzioni' di proprietà di undefined in node-form.js: 94 in node-form.js: 113
jepster
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.