Reemplace jQuery.once() con once() de JavaScript en Drupal 10.
¡Drupal 10 ya está aquí! Y Drupal 10 ya no incluye la biblioteca drupal/jquery.once
:
https://www.drupal.org/node/3158256
jQuery once fue eliminado del núcleo de Drupal, pero aún está presente en muchos módulos contribuidos:

Los mantenedores de módulos recibieron tickets de actualización con parches bajo el nombre "Automated Drupal 10 compatibility fixes":
https://www.drupal.org/project/media_library_edit/issues/3288511
Pero estas actualizaciones no contienen correcciones para jquery.once. Por eso muchos mantenedores pensaron que sus módulos ya estaban listos para Drupal 10 y no los probaron.
Así que si tienes el error "Uncaught TypeError: $(...).once is not a function", no te preocupes, es fácil de solucionar.
1. Necesitas cambiar la biblioteca core/jquery.once
por core/once
en el archivo *.libraries.yml
(ver captura de pantalla anterior)
dependencies:
- core/jquery
- core/once
2. Actualiza el código JavaScript y reemplaza $.once()
con la función once()
de JavaScript. Por ejemplo, código con jQuery.once():
Drupal.behaviors.fileBrowserClickProxy = {
attach: function (context, settings) {
$('.grid-item', context).once('bind-click-event').click(function () {
// código javascript/jQuery aquí.
});
}
};
Código con la función once()
de JavaScript (código funcional en Drupal 10):
Drupal.behaviors.fileBrowserClickProxy = {
attach: function (context, settings) {
$(once('bind-click-event', '.grid-item', context)).each(function () {
$(this).on('click', function() {
// código javascript/jQuery aquí.
});
});
}
};
Drupal 10 aún utiliza jQuery, por lo tanto podemos envolver la función once()
en el signo de dólar de jQuery, lo que hace que devuelva un objeto jQuery y nos permite usar el método .each()
de jQuery.
También puedes optar por no usar jQuery en absoluto en tu JavaScript personalizado:
https://youmightnotneedjquery.com/
Drupal.behaviors.fileBrowserClickProxy = {
attach: function (context, settings) {
once('bind-click-event', '.grid-item', context).forEach(el => {
el.addEventListener('click', () => {
// Solo JavaScript puro aquí.
});
el.classList.add(className);
});
}
};
Pero en ese caso, necesitarás reescribir todo el código jQuery dentro de la función de devolución de llamada del evento 'click'.