Antworten:
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 node
ist das ausgewählte Element? Sie sollten in der Lage sein, die tid
von einer der Eigenschaften für dieses Objekt abzurufen.
Drupal 7 und 8 bieten zu diesem Zeitpunkt die automatische Generierung von jQuery-Ereignissen ohne benutzerdefinierten Code.
In Drupal 7 wurde das autocompleteSelect
Ereignis 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 autocompleteclose
Ereignis ist das jQuery-UI-Ereignis, das dem D7- autocompleteSelect
Ereignis am ähnlichsten ist . In D8 autocompleteselect
wird auch das jQuery UI- Ereignis ausgelöst, aber ein Ajax-Rückruf erhält keine aktualisierten Formularstatuswerte. autocompleteclose
Rü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 autocompleteSelect
Ereignis 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 .
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, '');
});
}
};
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');
}
})