Drupal 8, behaviors, and jQuery Once
When porting some front-end code from Drupal 7 to Drupal 8, I ran into an unexpected change in the use of jQuery.once()
. In Drupal 7, you’d do this in a behavior:
Code language: JavaScript
Drupal.behaviors.exampleBehavior = {
attach: function(context, settings) {
$('.example', context).once('example-behavior', function() {
// Do stuff.
});
},
detach: function(context, settings, trigger) {
$('.example', context).removeOnce('example-behavior', function() {
// Undo stuff.
});
}
};
In Drupal 8, however, you can’t pass in a function to jQuery.once()
, as the API for that jQuery plugin has changed. It now acts like jQuery.filter()
, in that it filters out any elements that have already been processed so they aren’t processed more than once, and returns a jQuery collection. So, in Drupal 8, the example would be:
Code language: JavaScript
Drupal.behaviors.exampleBehavior = {
attach: function(context, settings) {
$('.example', context).once('example-behavior').each(function() {
// Do stuff.
});
},
detach: function(context, settings, trigger) {
$('.example', context).removeOnce('example-behavior').each(function() {
// Undo stuff.
});
}
};