en
Как перевести Drupal Behavior на ванильный JavaScript

Как перевести Drupal Behavior на ванильный JavaScript

Работая над темой Drupal, часто возникают ситуации для вставки на страницу различных интерактивных элементов JavaScript. Так как Drupal имеет весьма много вызовов Ajax (включая BigPipe), часто возникает необходимость прицепить JavaScript таким образом, чтобы он обязательно сработал после того, как Ajax отрисует элементы страницы. Для этого мы используем Drupal.behavior (в связке с once()).

В свете глобального отказа от jQuery во фронтенде, нам необходимо обновить код Drupal.behavior таким образом, чтобы он использовал ванильный JavaScript.

jQuery

mymodule.libraries.yml

myfeature:
  js:
    js/myfeature.js: {}
  dependencies:
    - core/drupal
    - core/jquery
    - core/jquery.once

myfeature.js

(function ($, Drupal) {
  Drupal.behaviors.myfeature = {
    attach(context) {
      const $elements = $(context).find('[data-myfeature]').once('myfeature')
      // `$elements` всегда объект jQuery.
      $elements.each(processingCallback)
    },
  }

  function processingCallback(index, value) {
    // код...
  }
})(jQuery, Drupal)

JavaScript

mymodule.libraries.yml

myfeature:
  js:
    js/myfeature.js: {}
  dependencies:
    - core/drupal
    - core/once

myfeature.js

(function (Drupal, once) {
  Drupal.behaviors.myfeature = {
    attach(context) {
      const elements = once('my-feature', '[data-my-feature]', context)
      // `once` всегда возвращает массив.
      elements.forEach(processingCallback)
    },
  }

  // Параметры в методе $.each() и Array.foreach() меняются местами.
  function processingCallback(value, index) {
    // код...
  }
})(Drupal, once)

Можно заметить, что код стал изящнее, понятнее и проще.


Ссылки:

Последнее обновление: