Posts from January 2013
Trigger a javascript event when an autocomplete field changes
Related to my fieldset summary problem: autocomplete fields do not trigger the change
event in Javascript, for some reason. I wound up stealing part of a patch I found somewhere (I would link to it if I could find it in my browser history) in order to override the autocomplete prototype function and trigger a new autocompleteSelect
event when the user chooses an item in an autocomplete field. Just drop this function into a Javascript file in your module or theme:
(function ($) {
/**
* Puts the currently highlighted suggestion into the autocomplete field.
* Overridden from misc/autocomplete.js to add an event trigger on autocomplete
*/
if (Drupal.jsAC) {
Drupal.jsAC.prototype.select = function (node) {
this.input.value = $(node).data('autocompleteValue');
// Custom: add an event trigger
$(this.input).trigger('autocompleteSelect', [node]);
};
}
})(jQuery);
Note that this goes inside the (function ($) {})(jQuery);
block that appears in most Drupal Javascript files. If you're pasting into an existing file that already has them, you can omit the first and last line, and paste the function in between them.
Then you just bind to that event. Here's an example for the node author field on the node add/edit form:
$('input[name=name]', context).bind('autocompleteSelect', function() {
// Value chosen in autocomplete field.
// Do whatever you need to do.
var chosen_value = $(this).val();
});
NOTE: After using this code for a few days I found an error. Drupal.jsAC
is not defined on all pages, so an error is thrown when trying to set values on the prototype of a non-existent object. I've updated the code above to wrap it in a condition to check for Drupal.jsAC
before overriding it.
One more update, from February 19, 2013:
It turns out that the select()
function only runs when you click on an item in the autocomplete dropdown. If you use the arrow keys to select and item and hit enter to select it, the hidePopup()
function runs instead (by way of onkeyup()
), so you need to implement that one to. This is the core version, with only the autocompleteSelect
trigger added:
Drupal.jsAC.prototype.hidePopup = function (keycode) {
// Select item if the right key or mousebutton was pressed.
if (this.selected && ((keycode && keycode != 46 && keycode != 8 && keycode != 27) || !keycode)) {
this.input.value = $(this.selected).data('autocompleteValue');
// Custom: add an event trigger
$(this.input).trigger('autocompleteSelect');
}
// Hide popup.
var popup = this.popup;
if (popup) {
this.popup = null;
$(popup).fadeOut('fast', function () { $(popup).remove(); });
}
this.selected = false;
$(this.ariaLive).empty();
};
Category:
Drupal Version:
How to force an update of the summary on field sets (in vertical tabs)
Please excuse the long title: it took me a while to figure this one out, so I want to make sure that other people can find this when they need it.
On my current project, I'm changing the node author field based on the value of a user reference field on the node type: when a content admin sets the node reference field, the node author field is changed to match that user reference field value. Since the author field is shown in a fieldset, I wanted the summary on that fieldset to update when this change was made. It took me a while to figure out how, but it's pretty simple:
// Update the field summary if vertical tabs are in use
var tab = $('fieldset.node-form-author', context).data('verticalTab');
if (tab) {
tab.updateSummary();
}