Ответы:
На данный момент ни одно событие не запускается (по состоянию на 7.34), но есть патч по этой проблеме, который должен позволить вам использовать что-то вроде:
$('#input-id').on('autocompleteSelect', function(event, node) {
});
или если вы используете на старой версии JQuery
$('#input-id').bind('autocompleteSelect', function(event, node) {
});
Где node
находится выбранный пункт. Вы должны иметь возможность получить tid
одно из свойств этого объекта.
В настоящее время 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 .
Мне нужно было использовать поведение, чтобы заставить его работать (благодаря проблеме, упомянутой Клайвом, и этому комментарию: 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, '');
});
}
};
В 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');
}
})