Jakie zdarzenie jest wyzwalane po uruchomieniu autouzupełniania i jak odzyskać wybraną wartość

8

Mam formularz dodawania węzła z odwołaniem do terminu, który korzysta z widżetu autouzupełniania.

Chcę „tid” wypełnionego terminu przez użytkownika korzystającego z widżetu autouzupełniania.

sel_space
źródło

Odpowiedzi:

13

W tej chwili żadne zdarzenie nie jest wyzwalane (od 7.34), ale jest łatka na ten problem, która powinna pozwolić ci użyć czegoś takiego:

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

});

lub jeśli korzystasz ze starej wersji jQuery

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

});

Gdzie nodejest wybrany element. Powinieneś być w stanie uzyskać tidjedną z właściwości tego obiektu.

Clive
źródło
Dziękuję za odpowiedź Znalazłem także inne rozwiązanie opisane na tym blogu: brockboland.com/drupaldork/2013/01/…
sel_space
@Clive: Czy ta funkcja autouzupełniania wyszukiwania interfejsu API działa? Mam zapytanie tutaj drupal.stackexchange.com/questions/286399/…
Suraj,
3

Drupal 7 i 8 zapewniają w tej chwili generowanie zdarzeń autouzupełniania jQuery bez żadnego niestandardowego kodu.

W Drupal 7 autocompleteSelectwydarzenie zostało dodane w numerze Drupal # 365241 . (Clive wspomniał, że to się dzieje, kiedy opublikował swoją odpowiedź).

Drupal 8 korzysta z widgetu autouzupełniania interfejsu użytkownika jQuery . autocompletecloseZdarzenie jest zdarzeniem jQuery UI najbardziej podobny do D7 autocompleteSelectimprezy. W D8 autocompleteselectrównież zostanie wyzwolone zdarzenie interfejsu użytkownika jQuery, ale wywołanie zwrotne Ajax na nim nie otrzyma zaktualizowanych wartości stanu formularza. autocompleteclosewywołania zwrotne są dostarczane ze zaktualizowanymi wartościami stanu formularza, co zwykle jest tym, czego chcesz.

Jak wskazały inne odpowiedzi, możesz skorzystać z danych zdarzeń w przeglądarce klienta, używając jQuery w module obsługi zdarzeń lub Drupal.behaviors ( Drupal 7 , Drupal 8 ). W Drupal 7 używałbyś tego autocompleteSelectwydarzenia, a na Drupal 8 autocompleteclose.

Jeśli potrzebujesz wartości w kodzie PHP, możesz użyć wywołania zwrotnego Ajax. Oto kilka wskazówek, jak to zrobić w Drupal 7 lub w Drupal 8 .

klucz
źródło
1

Musiałem użyć zachowania, aby to zadziałało (dzięki problemowi wspomnianemu przez Clive i temu komentarzowi: 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
źródło
0

W Drupal 8 to się zmieniło. Możesz zastąpić funkcjonalność następującym kodem.

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

Przesłania kod w core/misc/autocomplete.js.

Następnie w kodzie możesz słuchać

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
źródło
Korzystanie z zastąpienia tego formularza nie jest najlepszą praktyką. Jeśli dwa takie zastąpienia zostaną umieszczone na stronie z nieco innymi nazwami zdarzeń, np. „Autocomplete-select” i „autocompleteSelect”, ostatnie przypisane będzie miało pierwszeństwo, a pierwsze zdarzenie nigdy się nie uruchomi. Poza tym Drupal 7 i 8 wyzwalają odpowiednie zdarzenia bez dodatkowego kodu. Zobacz moją odpowiedź drupal.stackexchange.com/a/228150/2272 .
keithm
Drupal.autocomplete.options.select = funkcja selectHandler (event, ui) {Błąd kończy się niepowodzeniem, gdy żadne pole autouzupełniania nie jest dostępne na określonej stronie. Musisz zaimplementować kontrolę, aby upewnić się, że istnieje pole autouzupełniania. W przeciwnym razie zahamujesz swój JS. Otrzymasz takie błędy:> Nieprzechwycony błąd typu: Nie można odczytać właściwości „options” niezdefiniowanej w node-form.js: 94 w node-form.js: 113
jepster