Что событие вызвало после запуска автозаполнения и как получить выбранное значение

8

У меня есть форма добавления узла со ссылкой на термин, которая использует виджет автозаполнения.

Я хочу, чтобы пользователь использовал "tid" заполненного термина с помощью виджета автозаполнения.

sel_space
источник

Ответы:

13

На данный момент ни одно событие не запускается (по состоянию на 7.34), но есть патч по этой проблеме, который должен позволить вам использовать что-то вроде:

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

});

или если вы используете на старой версии JQuery

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

});

Где nodeнаходится выбранный пункт. Вы должны иметь возможность получить tidодно из свойств этого объекта.

Клайв
источник
Спасибо за ответ Я также нашел другое решение, описанное в этом сообщении в блоге: brockboland.com/drupaldork/2013/01/…
sel_space
@Clive: Эта работа для автозаполнения API поиска? У меня есть запрос здесь drupal.stackexchange.com/questions/286399/…
Suraj
3

В настоящее время Drupal 7 и 8 обеспечивают генерацию событий автозаполнения jQuery без какого-либо специального кода.

В Drupal 7 autocompleteSelectсобытие было добавлено в выпуске Drupal # 365241 . (Клайв упомянул, что это происходило, когда он опубликовал свой ответ.)

Drupal 8 использует виджет автозаполнения пользовательского интерфейса jQuery . Это autocompletecloseсобытие пользовательского интерфейса jQuery, наиболее похожее на autocompleteSelectсобытие D7 . В D8 autocompleteselectтакже будет инициировано событие пользовательского интерфейса jQuery, но обратный вызов Ajax для него не будет получать обновленные значения состояния формы. autocompletecloseобратные вызовы предоставляются с обновленными значениями состояния формы, что обычно является тем, что вы хотите.

Как указали другие ответы, вы можете использовать данные о событиях в браузере клиента, используя jQuery on обработчик событий, или Drupal.behaviors ( Drupal 7 , Drupal 8 ). В Drupal 7 вы используете autocompleteSelectсобытие, а в Drupal 8 autocompleteclose.

Если вам нужно значение в вашем PHP-коде, можно использовать обратный вызов Ajax. Вот несколько советов, как это сделать в Drupal 7 или в Drupal 8 .

keithm
источник
1

Мне нужно было использовать поведение, чтобы заставить его работать (благодаря проблеме, упомянутой Клайвом, и этому комментарию: 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
источник
0

В Drupal 8 это изменилось. Вы можете переопределить функциональность с помощью следующего кода.

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

Переопределяет код в core/misc/autocomplete.js.

Тогда в вашем коде вы можете слушать

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');
    }
  })
Джейсон Яррингтон
источник
Использование переопределения этой формы не является лучшей практикой. Если два таких переопределения помещаются на сайт с несколько разными именами событий, например, «autocomplete-select» и «autocompleteSelect», последнее назначенное будет иметь приоритет, и первое событие никогда не будет инициировано. Кроме того, Drupal 7 и 8 запускают соответствующие события без дополнительного кода. Смотрите мой ответ drupal.stackexchange.com/a/228150/2272 .
Keithm
Drupal.autocomplete.options.select = function selectHandler (event, ui) {Сбой, если на данной странице нет поля автозаполнения. Вы должны выполнить проверку, чтобы убедиться, что поле автозаполнения существует. В противном случае вы будете тормозить JS. Тогда вы получите такие ошибки:> Uncaught TypeError: Невозможно прочитать свойство 'options' undefined в node-form.js: 94 в node-form.js: 113
jepster