Некоторое время назад писал про Drupal.behaviors и jQuery в «шестерке». Там, как мы помним, чтобы одни и те же действия не выполнялись над элементами многократно, нужно было использовать контекст, а также присваивать и проверять наличие спец. класса. В общем, вот так:
Drupal.behaviors.myModuleBehavior = function(context) {
$('.module-class-object:not(.module-class-processed)', context).each(function () {
$(this).addClass('module-class-processed');
// Do things
});
};
Как нетрудно догадаться, для каждого нового «поведения» этот код надо копировать (что не очень хорошо).
В Drupal 7, однако, стало гораздо удобнее: в него интегрирована новая функция jQuery — once()
. Она умеет присваивать спец. классы и проверять их наличие сама. Вот так:
(function ($) {
Drupal.behaviors.myBehavior = {
attach: function (context, settings) {
$('div.my_behavior').once(function () {
//этот код выполнится только раз для каждого div.my_behavior, независимо от числа запусков Drupal.attachBehaviors()
});
}
};
}
Прогресс, как говорится, налицо.
Единственный недостаток (если это можно считать недостатком) once() — объекту, возвращаемому селектором $(...), должно быть можно присвоить CSS-класс. То есть запись $(document).once(...) результатов не даст. А вот запись $('body').once(...) — даст.