Drupal behaviors: Как использовать
Если вы добавляете JavaScript в пользовательский модуль очень легко и заманчиво, чтобы просто добавить это следующим образом:
jQuery(document).ready(function($){ alert(‘hot dog flavored water’); });
Теперь этот код работает прекрасно, но что делать, если Ваш JavaScript должен быть выполнен при загрузке страницы и после запроса AJAX? Представьте себе, у вас есть представление, которое использует "Views Infinite Scroll", и вы хотите добавить CSS класс к каждому результату, например:
jQuery(document).ready(function($){ $('.view-display-id-page .views-row').addClass('fancy-pants'); });
Это будет работать для результатов, которые отображаются изначально, но для всех результатов, которые загружаются AJAX вызова Бесконечные спирального классе не добавляется. Вот где Drupal behaviors пригодится.Drupal behaviors будет выполняться при каждом запросе, включая AJAX запросы, поэтому давайте сделаем эквивалент кода выше, но на этот раз с помощью этого метода:
Drupal.behaviors.infiniteScrollAddClass = { attach: function (context, settings) { $('.view-display-id-page .views-row').addClass('fancy-pants'); } };
Я признаю, что много чего может быть не совсем понятно - так вот некоторые объяснения:
- infiniteScrollAddClass: Это ваше имя и оно должно быть уникальными. Например, как правило, это имя вашего модуля, но это не является обязательным.
- context: На самом деле это действительно очень круто, при загрузке страницы контексте будет содержать весь документ и после запроса AJAX будет иметь все только что загруженных элементов. Таким образом, вы можете рассматривать контент, который загружается через AJAX в иначе, чем другие.
- settings: Эта информация может быть передана с помощью JavaScript PHP, он похож на доступ к нему через Drupal.settings. Для дальнейшего понимания я рекомендую этот источник.
Там, очевидно, известны случаи, когда некоторые функции не должны быть выполнены на каждом запросе. В таком случае его великое, чтобы использовать JQuery .once() метод. Так скажем, мы хотим дать все изначально загружены результаты, на наш взгляд дополнительный класс, за то, как мы это будет продолжаться вот так:
Drupal.behaviors.infiniteScrollAddClass = { attach: function (context, settings) { // these are the elements loaded in first $('.view-display-id-page').once(function(){ $(this).find('.views-row').addClass('i-was-here-first'); }); // everybody $('.view-display-id-page .views-row').addClass('fancy-pants'); } };
This will add the class “i-was-here-first” to all the view results present on page load, everybody else joining in via AJAX will just get the “fancy-pants” class.
Это позволит добавить класс "i-was-here-first" всем результатам view при загрузке страницы, и все остальные, которые будут загружены через AJAX получат "fancy-pants" класс.
Это хороший пример Drupal behaviors, если вы не использовали его используете его!