Was ist das Ereignis, das ausgelöst wird, nachdem eine automatische Vervollständigung ausgeführt wurde, und wie wird der ausgewählte Wert abgerufen?

8

Ich habe ein Formular zum Hinzufügen von Knoten mit einem Begriff, der das Widget für die automatische Vervollständigung verwendet.

Ich möchte die "Nachricht" des gefüllten Begriffs vom Benutzer mithilfe des Widgets für die automatische Vervollständigung.

sel_space
quelle

Antworten:

13

Momentan wird kein Ereignis ausgelöst (Stand 7.34), aber es gibt einen Patch zu diesem Problem , mit dem Sie Folgendes verwenden können:

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

});

oder wenn Sie eine alte Version von jQuery verwenden

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

});

Wo nodeist das ausgewählte Element? Sie sollten in der Lage sein, die tidvon einer der Eigenschaften für dieses Objekt abzurufen.

Clive
quelle
Vielen Dank für die Antwort Ich habe auch eine andere Lösung gefunden, die in diesem Blog-Beitrag beschrieben wird: brockboland.com/drupaldork/2013/01/…
sel_space
@Clive: Ist diese Arbeit für die Suche API automatisch vervollständigen
Suraj
3

Drupal 7 und 8 bieten zu diesem Zeitpunkt die automatische Generierung von jQuery-Ereignissen ohne benutzerdefinierten Code.

In Drupal 7 wurde das autocompleteSelectEreignis in der Drupal-Ausgabe Nr. 365241 hinzugefügt . (Clive erwähnte, dass dies im Gange war, als er seine Antwort veröffentlichte.)

Drupal 8 verwendet das Widget für die automatische Vervollständigung der jQuery-Benutzeroberfläche . Das autocompletecloseEreignis ist das jQuery-UI-Ereignis, das dem D7- autocompleteSelectEreignis am ähnlichsten ist . In D8 autocompleteselectwird auch das jQuery UI- Ereignis ausgelöst, aber ein Ajax-Rückruf erhält keine aktualisierten Formularstatuswerte. autocompletecloseRückrufe werden mit aktualisierten Formularstatuswerten bereitgestellt, was normalerweise gewünscht wird.

Wie aus den anderen Antworten hervorgeht, können Sie die Ereignisdaten im Client-Browser mithilfe eines jQuery on- Ereignishandlers oder von Drupal.behaviors ( Drupal 7 , Drupal 8 ) verwenden. In Drupal 7 würden Sie das autocompleteSelectEreignis verwenden und in Drupal 8 autocompleteclose.

Wenn Sie den Wert in Ihrem PHP-Code benötigen, kann ein Ajax-Rückruf verwendet werden. Hier finden Sie einige Anweisungen dazu in Drupal 7 oder in Drupal 8 .

Keithm
quelle
1

Ich musste ein Verhalten verwenden, damit es funktioniert (dank des von Clive erwähnten Problems und dieses Kommentars: 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
quelle
0

In Drupal 8 hat sich dies verschoben. Sie können die Funktionalität mit dem folgenden Code überschreiben.

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

Überschreibt den Code in core/misc/autocomplete.js.

Dann können Sie in Ihrem Code hören

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
quelle
Die Verwendung einer Überschreibung dieses Formulars ist keine bewährte Methode. Wenn zwei solcher Überschreibungen in eine Site mit leicht unterschiedlichen Ereignisnamen eingefügt werden, z. B. "Autocomplete-Select" und "AutocompleteSelect", hat die zuletzt zugewiesene Vorrang und das erste Ereignis wird niemals ausgelöst. Außerdem lösen Drupal 7 und 8 entsprechende Ereignisse ohne zusätzlichen Code aus. Siehe meine Antwort drupal.stackexchange.com/a/228150/2272 .
Keithm
Drupal.autocomplete.options.select = function selectHandler (event, ui) {Schlägt fehl, wenn auf der jeweiligen Seite kein Feld für die automatische Vervollständigung verfügbar ist. Sie müssen eine Prüfung durchführen, um sicherzustellen, dass das Feld für die automatische Vervollständigung vorhanden ist. Andernfalls bremsen Sie Ihren JS. Sie erhalten solche Fehler dann:> Nicht erfasster Typ Fehler: Die Eigenschaft 'Optionen' von undefined kann nicht unter node-form.js gelesen werden: 94 unter node-form.js: 113
jepster