Qual é o evento acionado após a execução de um preenchimento automático e como recuperar o valor selecionado

8

Eu tenho um nó adicionar formulário com uma referência de termo que usa o widget de preenchimento automático.

Eu quero a "descrição" do termo preenchido pelo usuário usando o widget de preenchimento automático.

sel_space
fonte

Respostas:

13

Nenhum evento é acionado no momento (a partir da 7.34), mas há um patch sobre esse problema que deve permitir que você use algo como:

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

});

ou se você estiver usando na versão antiga do jQuery

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

});

Onde nodeestá o item selecionado. Você deve conseguir obter tiduma das propriedades desse objeto.

Clive
fonte
Obrigado pela resposta, também encontrei outra solução descrita nesta postagem do blog: brockboland.com/drupaldork/2013/01/…
sel_space
@Clive: este trabalho é para autocompletar api de pesquisa? Eu tenho uma consulta aqui drupal.stackexchange.com/questions/286399/…
Suraj
3

Drupal 7 e 8 fornecem a geração de eventos de preenchimento automático do jQuery sem nenhum código personalizado no momento.

No Drupal 7, o autocompleteSelectevento foi adicionado na edição Drupal # 365241 . (Clive mencionou que isso estava em andamento quando ele postou sua resposta.)

O Drupal 8 usa o widget de preenchimento automático da UI do jQuery . O autocompletecloseevento é o evento da UI do jQuery mais semelhante ao autocompleteSelectevento D7 . No D8, o autocompleteselectevento da UI do jQuery também será acionado, mas um retorno de chamada do Ajax não receberá valores atualizados do estado do formulário. autocompletecloseretornos de chamada são fornecidos com valores atualizados do estado do formulário, que geralmente é o que você deseja.

Como as outras respostas indicaram, você pode usar os dados do evento no navegador do cliente usando um jQuery no manipulador de eventos ou Drupal.behaviors ( Drupal 7 , Drupal 8 ). No Drupal 7 você usaria o autocompleteSelectevento e no Drupal 8 autocompleteclose.

Se você precisar do valor em seu código PHP, um retorno de chamada Ajax pode ser usado. Aqui estão algumas instruções de como fazer isso no Drupal 7 ou no Drupal 8 .

keithm
fonte
1

Eu precisava usar um comportamento para fazê-lo funcionar (graças ao problema mencionado por Clive e este comentário: 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
fonte
0

No Drupal 8, isso mudou. Você pode substituir a funcionalidade pelo código a seguir.

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

Substitui o código em core/misc/autocomplete.js.

Então, no seu código, você pode ouvir

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
fonte
Usar uma substituição deste formulário não é uma prática recomendada. Se duas dessas substituições forem colocadas em um site com nomes de eventos ligeiramente diferentes, por exemplo, 'autocomplete-select' e 'autocompleteSelect', a última designada terá precedência e o primeiro evento nunca será acionado. Além disso, Drupal 7 e 8 acionam eventos apropriados sem nenhum código adicional. Veja minha resposta drupal.stackexchange.com/a/228150/2272 .
555 keithm
Drupal.autocomplete.options.select = função selectHandler (evento, interface do usuário) {Falha, quando nenhum campo de preenchimento automático está disponível na página específica. Você deve implementar uma verificação para garantir que o campo de preenchimento automático exista. Caso contrário, você travará seu JS. Você receberá esses erros:> TypeError não capturado: Não é possível ler a propriedade 'opções' de undefined em node-form.js: 94 em node-form.js: 113
jepster 11/11/11