Що подія викликається після запуску автозаповнення та як отримати вибране значення


8

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

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

Відповіді:


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 UI . autocompletecloseПодія є подією Jquery UI найбільш схожим на D7 autocompleteSelectподія. У D8 autocompleteselectподія jQuery UI також буде запущена, але зворотний виклик Ajax на ньому не отримає оновлених значень стану форми. autocompletecloseВідклики викликів надаються оновленими значеннями форми форми, що зазвичай є тим, що потрібно.

Як зазначено в інших відповідях, ви можете використовувати дані подій у веб-переглядачі клієнта, використовуючи jQuery на обробці подій, або Drupal.behaviors ( Drupal 7 , Drupal 8 ). У Drupal 7 ви б використовували autocompleteSelectподію, а в Drupal 8 autocompleteclose.

Якщо вам потрібне значення у вашому PHP-коді, може бути використаний зворотний дзвінок Ajax. Ось декілька вказівок, як це зробити в Drupal 7 або в Drupal 8 .


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

      });
    }
  };

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 .
кейт

Drupal.autocomplete.options.select = функція selectHandler (подія, ui) {Збігає, коли на певній сторінці недоступне поле автозаповнення. Ви повинні здійснити перевірку, щоб переконатися, що існує поле автозаповнення. Інакше ви гальмуєте свій JS. Ви отримаєте такі помилки тоді:> Uncaught TypeError: Неможливо прочитати властивості 'options' undefined у node-form.js: 94 at node-form.js: 113
jepster
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.