logo

Paleta de lienzo: 隆Hazlo colorido!馃帹

Palette - Constructor visual de p谩ginas, no se requiere t铆tulo en dise帽o.

Demo en vivo Descargar Palette

Scroll

6.8. Trabajo con JavaScript/jQuery en Drupal. 驴Qu茅 son los behaviors?

04/05/2025, by Ivan

Para comenzar, recordemos c贸mo incluir archivos JavaScript personalizados en nuestro tema. En el archivo .libraries.yml necesitas incluir la clave js:

global-styling:
  version: 1.x
  css:
    theme:
      css/style.css: {}
      css/print.css: { media: print }
  js:
    js/custom.js: {}
  dependencies:
    - core/jquery
    - core/jquery.once

Es importante respetar la indentaci贸n de dos espacios. As铆 hemos incluido el archivo js/custom.js, pero esto no es suficiente para que jQuery funcione. Drupal no lo incluye por defecto, por lo tanto debe ser agregado expl铆citamente:

dependencies:
  - core/jquery

Tambi茅n usaremos jQuery.once(), un plugin adicional que permite ejecutar eventos o acciones solo una vez por elemento:

dependencies:
  - core/jquery
  - core/jquery.once

Esto es importante porque en Drupal el c贸digo JavaScript puede ejecutarse varias veces, especialmente en interacciones AJAX. Por eso usamos el m茅todo .once().

Agregando c贸digo en el archivo custom.js

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {
      $(context).find('.click-me').once('myCustomBehavior').click(function () {
        alert('隆Hola, mundo!');
      });
    }
  };
})(jQuery);

Encerramos el c贸digo jQuery en esta funci贸n porque Drupal ejecuta jQuery en modo .noConflict(), lo que evita conflictos con otras bibliotecas como Prototype o MooTools. As铆, podemos usar el signo $ sin problemas dentro de nuestro contexto.

驴Qu茅 son los behaviors en Drupal?

Si escribes c贸digo jQuery en Drupal, debes envolverlo en un behavior. El nombre del behavior debe ser 煤nico, como en el ejemplo myModuleBehavior. Puedes definir m煤ltiples behaviors:

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {
      // Tu c贸digo aqu铆.
    }
  };

  Drupal.behaviors.productPageBehavior = {
    attach: function (context, settings) {
      // Otro c贸digo aqu铆.
    }
  };
})(jQuery);

Usa notaci贸n camelCase para nombrarlos. Los behaviors se ejecutan cuando se carga la p谩gina y con cada solicitud AJAX. Esto los hace muy diferentes de:

$(document).ready(function () {
  // No se recomienda en Drupal.
});

El uso de .once() previene la ejecuci贸n duplicada del comportamiento:

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {
      $('.inner').once('add-paragraph').append('<p>Prueba</p>');
    }
  };
})(jQuery);

Uso de context en los behaviors

Cada vez que Drupal carga contenido mediante AJAX, el nuevo contenido es accesible a trav茅s de la variable context. As铆 no necesitas recorrer todo el DOM cada vez, solo usar:

(function ($) {
  Drupal.behaviors.myModuleBehavior = {
    attach: function (context, settings) {
      $(context).find('.inner').once('add-paragraph').append('<p>Prueba</p>');
    }
  };
})(jQuery);

Ahora el comportamiento est谩 implementado correctamente seg煤n el estilo de Drupal. Aunque puedes usar $(document).ready(), no se recomienda porque solo se ejecuta una vez y no con AJAX.

Si tienes preguntas sobre jQuery/JavaScript o sugerencias para nuevos temas, escr铆belas en los comentarios.